Установка двухстороннего связанного атрибута директивы в HTML с AngularJS

0

Я только начинаю с AngularJs и сталкиваюсь с проблемой, которая может быть результатом неправильного понимания директив/контроллеров/изолированной области. Я пытаюсь найти способ установить атрибут директивы true/false из html и сохранить свойство на контроллере в соответствии с этим атрибутом. То, с чем я работаю, это:

  1. Контроллер (LoginController) со свойством signUpEnabled
  2. Директива (myLogin), которая возвращает это:

        var directive = {
        bindToController: true,
        controller: 'LoginController',
        controllerAs: 'loginVm',
        templateUrl: 'login/my-login.directive.html',
        restrict: 'E',
        scope: {
            signUpEnabled: '='
        }
    };
    
  3. HTML, где директива используется так:

    <my-login sign-up-enabled="true">

Я получаю ошибку: Error: [$compile:nonassign] Expression 'true' used with directive 'frintLogin' is non-assignable!

Он работает нормально, когда я устанавливаю signUpEnabled в false в HTML - возможно, потому, что это свойство инициализируется в контроллере. Я собираюсь сделать это неправильно или я что-то пропустил (например, наблюдая signUpEnabled в функции ссылки?)

Спасибо за вашу помощь. Не уверен, что это хороший способ сделать что-то, но я думаю, что могу получить поведение, которое хочу, добавив эту ссылку в директиву (после изменения привязки signUpEnabled в области выделения к '@'):

    function link(scope, element, attrs, ctrl) {
        $timeout(function() {
            ctrl.signUpEnabled = scope.$eval(attrs.signUpEnabled)
        });            ;
    }
  • 1
    То, как вы это написали, ищет свойство с именем "true" в области видимости, которая существует вне вашей директивы. См. Раздел «область применения» в документации: docs.angularjs.org/api/ng/service/…
Теги:
angularjs-directive
angularjs-controller

1 ответ

1
Лучший ответ

Двустороннее связывание подразумевает, что вы можете сделать scope.signUpEnabled = something а что- something = scope.signUpEnabled. Поскольку вы устанавливаете sign-up-enabled="true" в директиве, вы получаете эту ошибку, потому что вы не можете установить "true" на что-либо.

Похоже, вам нужна привязка @. Это будет препятствовать вам установить sign-up-enabled с sign-up-enabled атрибута в строку.

EDIT: Ой, просто понял, что вы пытаетесь сохранить значение в соответствии с переменной контроллера. В этом случае сохраните привязку как = но вместо этого установите для параметра sign-up-enabled=scopeFieldFromController. Вы также захотите инициализировать $scope.scopeFieldFromController=true в контроллере.

Надеюсь, это было не слишком запутанно.

  • 0
    Спасибо! Так нельзя ли установить это значение из HTML? Контроллер контролирует несколько представлений, единственное различие между ними основано на том, является ли это свойство (signUpEnabled) истинным или нет.
  • 1
    Нет, не с двухсторонней привязкой - это должно быть определено в контроллере. Если signUpEnabled всегда имеет значение true в этом конкретном представлении, то, возможно, вам нужна привязка @.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню