我有各种输入(包括稍后将解释的指令),例如:
<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]();
};
});
这行得通,但对我来说似乎是对 Angular 的滥用。相反,使用隔离范围会更有意义,如下所示:
scope: {validate: "&"}
然后我可以使用scope.validate()
而不是scope[attrs.validate]()
. 但是,对于隔离范围,我无法更新控制器中的相应值。使用{maskValue: "="}
不起作用,因为这会尝试更新maskValue
父级的属性而不是特定值。我认为 using{ssn: "="}
会起作用,但是我必须更新控制器的特定属性,而不是将其设置为指令属性,这会使指令不灵活。显然$parent
也不推荐使用。
如何在隔离范围指令内动态访问控制器的属性?
- 示例工作代码:http: //jsfiddle.net/MmyvX/
- 尝试我想要实现的目标(不工作):http: //jsfiddle.net/MmyvX/1/
编辑:我不能在输入上使用ng-model=ssn
等,因为在mask-value
输入的实际值中的焦点/模糊事件发生了变化。例如,它可能会变成*****####
,但我需要将实际值存储在#########
某处,并且控制器似乎是合适的位置,因为控制器稍后会出于其他原因使用它。