У меня есть различные входы (в том числе директив, которые будут объяснены позже), таких как:свойства использования контроллера/методы в директиве
<input mask-value="ssn" validate="checkSsn"/>
<input mask-value="pin" validate="checkPin"/>
Эти свойства в контроллере:
app.controller("Ctrl", ['$scope', function ($scope) {
$scope.ssn = "";
$scope.pin = "";
$scope.checkSsn = function() { /* validate $scope.ssn */ };
$scope.checkPin = function() { /* validate $scope.pin */ };
}]);
Наконец, maskValue
директивы:
app.directive("maskValue", function() {
return function (scope, element, attrs) {
/* does some focus/blur magic and string replacement */
scope[attrs.maskValue] = this.value;
scope[attrs.validate]();
};
});
Это работает, но это, кажется, как злоупотребления Угловая мне. Вместо этого, было бы более целесообразно использовать изолированный объем, как в:
scope: {validate: "&"}
Тогда я мог бы использовать scope.validate()
вместо scope[attrs.validate]()
. Однако, с изолированной областью действия Я не могу обновить соответствующее значение в контроллере. Использование {maskValue: "="}
не работает, потому что это попытается обновить свойство maskValue
родителя, а не определенное значение. Я думаю, что использование {ssn: "="}
будет работать, но тогда я должен обновить определенное свойство контроллера, а не устанавливать его как атрибут директивы, который сделает директиву негибкой. По-видимому, использование $parent
также не рекомендуется.
Как я могу динамически получить доступ к свойствам контроллера внутри изолированной директивы scope?
- Пример рабочий код: http://jsfiddle.net/MmyvX/
- Попытка, что я пытаюсь достичь (не работает): http://jsfiddle.net/MmyvX/1/
EDIT: я не могу использовать ng-model=ssn
и т.д. на входах потому что во время событий фокуса/размытия в mask-value
изменяется фактическое значение входа. Например, он может стать *****####
, но мне нужно сохранить фактическое значение #########
где-то, и контроллер, похоже, является подходящим местом, так как контроллер будет использовать его по другим причинам позже.
Использование области изоляции с '=' свойствами делает именно то, что вы хотите. Почему вы говорите, что это не работает? Не могли бы вы предоставить скрипт Plunker/jsFiddle? –
@MichaelBenford Я подниму его. '=' не работает точно, потому что он обновляет 'maskValue' в контроллере (которого не существует). Я мог бы сделать, например, 'ssn:" = "', но тогда я полагаюсь на определенное значение. Я хочу, чтобы я смог прозрачно обновлять свойство. –
@MichaelBenford. Вы можете видеть, что это работает: http://jsfiddle.net/MmyvX/ - это моя попытка более уклонно (я думаю), используя изолированную область. Это не работает: http://jsfiddle.net/MmyvX/1/ –