這是一個XY-question的經典示例(如果不是雙XY問題)。
你不需要「鏈事件處理程序」(無論你是什麼意思)。我認爲,您也不需要手動觸發驗證,因爲您正在驗證外部數據。
在Angular中進行驗證只是運行 - 而不是通過更改數據來觸發。
要添加您自己的自定義驗證器,您需要創建一個指令(它看起來像你一樣)。在該指令中,您可能需要指定要驗證的內容,例如要檢查重複項的字符串數組。
假設,爲了簡單起見,您要驗證ViewModel中的另一個值。假設,它會變成這樣如何使用:
<input ng-model="bar">
<form name="form1">
<input ng-model="foo" not-equal-to="bar">
</form>
<span ng-show="form1.$error.notEqualTo">error: foo is equal to bar</span>
所以,你需要創建一個指令notEqualTo
,增加了一個驗證的ngModel.$validators
管道。該指令還需要$watch
更改到bar
和重新設置有效期:
app.directive("notEqualTo", function(){
return {
require: "ngModel",
scope: {
notEqualTo: "="
},
link: function(scope, element, attrs, ngModel){
// register "notEqualTo" validator
ngModel.$validators.notEqualTo = function(modelValue){
return validate(modelValue, scope.notEqualTo);
};
// rerun validation on changes to scope.notEqualTo
scope.$watch("notEqualTo", function(){
ngModel.$setValidity("notEqualTo",
validate(ngModel.$modelValue, scope.notEqualTo));
});
function validate(one, other){
return one !== other;
}
}
};
});
plunker
你是什麼意思的「觸發驗證程序」嗎?通常驗證只是運行,你可以通過用'ng-show =「形式顯示消息來做出反應。$ invalid」'等...或者,你是否試圖阻止任何類型的驗證完成(這可能是有意義的在異步驗證中)。另外,嘗試澄清你的問題。它從驗證例程開始,但實際上談論了攔截ng-click處理程序 – 2015-02-11 07:37:50
我需要手動觸發驗證例程,因爲有時數據中的更改不會被輸入控件驗證拾取。也就是說,其他控件可以觸發對未綁定到輸入控件的範圍值的更改。輸入控制驗證之一是對重複項的作用域變量進行交叉檢查。 – DanHeidel 2015-02-11 18:10:51