Ich habe die folgende Direktive, die ich für die Validierung auf einem Mehrfachauswahl verwenden, um (dynamische) Länge Überprüfung der Anzahl der ausgewählten Elemente zu ermöglichen.
(function() {
'use strict';
angular
.module('myModule')
.directive('listLength', listLength);
listLength.$inject = ['$parse'];
function listLength($parse) {
var directive = {
require: 'ngModel',
restrict: 'A',
link: link
};
function link(scope, elem, attr, ngModel) {
var length = 0;
var exp = $parse(attr.listLength);
if (exp.constant) {
// Single value, no need to watch
length = exp(scope);
} else {
// We have an expression, need to watch for changes
scope.$watch(attr.listLength, function(newVal, oldVal) {
length = newVal;
});
}
//For DOM -> model validation
ngModel.$parsers.unshift(function(value) {
if (!angular.isUndefined(value) && value !== "") {
var valid = value.length === length;
ngModel.$setValidity('listLength', valid);
return valid ? value : undefined;
}
return value;
});
//For model -> DOM validation
ngModel.$formatters.unshift(function(value) {
if (!angular.isUndefined(value) && value !== "") {
var valid = value.length === length;
ngModel.$setValidity('listLength', valid);
}
return value;
});
}
return directive;
}
})();
Um es richtig zu aktualisieren zu haben, muss ich die Validierung auszulösen, wenn der Ausdruck (attr.listLength) Updates ausgeführt werden, aber es ist nicht mir klar, wie dies zu erreichen. Ich habe versucht, ngModel.$dirty
auf True zu setzen, aber es wird immer noch nicht aktualisiert.
Dies stoppt es funktioniert völlig :) Die $ watch-Funktion selbst funktionierte gut, aber wenn Länge aktualisiert wird, muss ich die $ parsers.unshift erneut validiert Wert gegen die neue Länge – ptr
Ich glaube, dass Validierung im Watch Callback aufgerufen werden sollte. Beim Watch Callback ist der einzige Code, der ausgeführt wird, der gesetzte Wert für das Attribut. –