Ich habe einen Winkel Controller wie folgt:beobachten mehrere Variablen mit vollständiger Name unbekannt
function SignUpController($window, accountService) {
var vm = this;
vm.errors = null;
vm.user = null;
vm.submit = function (user) {
accountService.signup(user)
.then(function (response) {
$window.location.href = "/";
})
.catch(function (response) {
vm.errors = response.data.errors;
}
};
}
Die API eine Liste der Fehler zurückgibt, falls sie vorhanden sind, wie folgt:
[
{code: "name", "message": "the name is required"}
]
Wenn Sind Fehler, füge ich diese Liste zu vm.errors hinzu. In HTML habe ich:
Die Direktive beobachtet vm.errors und füllt alle Spannen mit Validatoren mit der richtigen Fehlermeldung.
In meinen Controllern verwende ich immer vm.errors, aber in meinem HTML verwende ich oft etwas anderes, wie vmsignup, da ich vielleicht mehrere Controller habe.
So in diesem Beispiel die Richtlinie muss vmsignup.errors haben, damit es funktioniert:
angular.module("app").directive("validator", validator);
validator.$inject = ["$parse"];
function validator($parse) {
var validator = {
link: link,
replace: false,
restrict: "A"
};
return validator;
function link(scope, element, attributes) {
scope.$watch("vmsignup.errors", function (errors) {
if (errors) {
var result = errors.filter(function (error) {
if (error.code == null)
return false;
var position = attributes.validator.lastIndexOf(".");
if (position > -1)
return attributes.validator.slice(position + 1).toLowerCase() === error.code.toLowerCase();
else
return attributes.validator.toLowerCase() === error.code.toLowerCase();
});
if (result.length > 0) {
element.show().text(result[0].message);
return;
}
}
element.hide();
});
}
ich die Direktive wie etwas haben möchte:
scope.$watch("vm*.errors", ...
Ich nehme an, dies ist unmöglich, aber Es muss einen Weg geben, das zu lösen, oder?
ich glaube, die Lösung könnte eine neue Richtlinie „Validierung“ auf dem Formular verwendet hat, zu sagen, was das Modell ist:
<form name="form" ng-controller="SignUpController as vmsignup" validation-model="vmsignup">
Dann würde ich dies auf der Validator-Direktive verwenden:
scope.$watch(validator.model + ".errors", function (errors) {
Ist das eine gute Option? Kann das gemacht werden? Kann mir jemand helfen?
Sie sollten das Problem, das Sie lösen möchten, besser beschreiben. Vielleicht zeige ich mehr Code .. Ich glaube, dass Sie eine andere Lösung wählen könnten, um dasselbe Ergebnis zu erzielen. – manzapanza
@manzapanza Fair genug. Ich habe gerade meine Frage mit mehr Code aktualisiert und erklärt, was ich mache und was das "kleine" Problem ist, das ich lösen möchte. Hilft der zusätzliche Code und die zusätzlichen Informationen? Ich habe nichts vermisst. –