TLDR:爲什麼角度的ngMinlength接收$觀察插值更新,但我的自定義驗證指令不是?
我工作的一個自定義的驗證指令在角1.3和已經注意到一些似乎不一致。 angular中的指令似乎從attr。$ observe獲得內插更新,但我創建的指令的行爲方式不同。
我可以使用$ watch修復它,或綁定一個插值,但與現有的驗證指令不一致。有什麼區別,以及如何使我的自定義指令與內置的驗證指令類似地工作?
角的指令
var minlengthDirective = function() {
return {
restrict: 'A',
require: '?ngModel',
link: function(scope, elm, attr, ctrl) {
if (!ctrl) return;
var minlength = 0;
attr.$observe('minlength', function(value) {
minlength = int(value) || 0;
ctrl.$validate();
});
ctrl.$validators.minlength = function(modelValue, viewValue) {
return ctrl.$isEmpty(viewValue) || viewValue.length >= minlength;
};
}
};
};
我的指令
function observeMinLength($log){
return {
restrict: 'A',
require: '?ngModel',
link: function (scope, elm, attr, ctrl) {
if (!ctrl) return;
var min;
//Problem 1: observered value is not interpolated
//Problem 2: observe is only fired one time
attr.$observe('observeMinlength', function (value) {
$log.debug('observed value: ' + value);
min = parseInt(value, 10) || 0;
ctrl.$validate();
});
ctrl.$validators.mymin = function (modelValue, viewValue) {
var len = 0;
if (viewValue){
len = viewValue.length;
}
return ctrl.$isEmpty(viewValue) || viewValue.length >= min;
};
}
};
}
謝謝!那似乎是整個故事。 $ observe的文檔似乎暗示它會內插值,並且我假設缺少的前綴來自規範化屬性名稱。我從來沒有想過要看看jqLite文件! –