Я только начинаю с AngularJs и сталкиваюсь с проблемой, которая может быть результатом неправильного понимания директив/контроллеров/изолированной области. Я пытаюсь найти способ установить атрибут директивы true/false из html и сохранить свойство на контроллере в соответствии с этим атрибутом. То, с чем я работаю, это:
LoginController
) со свойством signUpEnabled
Директива (myLogin
), которая возвращает это:
var directive = {
bindToController: true,
controller: 'LoginController',
controllerAs: 'loginVm',
templateUrl: 'login/my-login.directive.html',
restrict: 'E',
scope: {
signUpEnabled: '='
}
};
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)
}); ;
}
Двустороннее связывание подразумевает, что вы можете сделать 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
в контроллере.
Надеюсь, это было не слишком запутанно.