我具有各種輸入(包括後面將要說明的指令)如:使用控制器的屬性/方法
<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
也不建議。
我該如何動態訪問控制器內部的隔離範圍指令?
- 示例工作代碼:http://jsfiddle.net/MmyvX/
- 嘗試什麼,我想實現(不工作):http://jsfiddle.net/MmyvX/1/
編輯:我不能投入使用ng-model=ssn
等。因爲在mask-value
的焦點/模糊事件期間,輸入的實際值發生了變化。例如,它可能會變成*****####
,但我需要在某處存儲實際值#########
,並且控制器似乎是適當的地方,因爲控制器稍後會將其用於其他原因。
在'='屬性中使用隔離範圍完全符合您的要求。你爲什麼說它不起作用?你能提供一個Plunker/jsFiddle腳本嗎? –
@MichaelBenford我會設置一個。 '='不能正確運行,因爲它會更新控制器中的'maskValue'(不存在)。我可以做例如'ssn:「=」'但是我依靠一個特定的值。我想能夠透明地更新一個屬性 –
@MichaelBenford你可以看到這是有效的:http://jsfiddle.net/MmyvX/ - 這是我嘗試以更有角度的方式(我認爲)使用隔離範圍。它不起作用:http://jsfiddle.net/MmyvX/1/ –