TLDR: Warum empfängt Winkel ngMinlength $ beobachten Updates mit interpolierten Werten, aber meine benutzerdefinierte Validierung Richtlinie nicht?
Ich arbeite an einer benutzerdefinierten Überprüfungsrichtlinie in Angular 1.3 und haben etwas bemerkt, das im Widerspruch zu sein scheint. Die eckige Anweisung scheint interpolierte Aktualisierungen von attr. $ Observe zu erhalten, aber die von mir erstellte Anweisung verhält sich nicht auf die gleiche Weise.
Ich kann $ watch verwenden, um es zu beheben, oder binde einen interpolierten Wert, aber stimmt nicht mit den vorhandenen Validierungsdirektiven überein. Was ist der Unterschied, und wie kann ich meine benutzerdefinierte Anweisung ähnlich wie die integrierten Validierungsanweisungen arbeiten lassen?
Angular der Richtlinie
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;
};
}
};
};
Meine Richtlinie
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;
};
}
};
}
Danke! Das scheint dann die ganze Geschichte zu sein. Die Dokumentation für $ object schien zu implizieren, dass sie den Wert interpolieren würde, und ich nahm an, dass das fehlende Präfix von der Normalisierung des Attributnamens herrührte. Ich hätte nie gedacht, die jqLite-Datei zu betrachten! –