Es gibt keine integrierte in der Weise, ng-change
für ein Formular zu tun.
Es ist nicht einmal notwendig sein kann, denn wenn Sie die Ansicht Modell richtig platziert und dann Ihre Formulareingaben wahrscheinlich bis zu einem gewissen Umfang lichteten Eigenschaft gebunden sind:
$scope.formData = {};
und in der Ansicht:
<form name="form1">
<input ng-model="formData.a">
<input ng-model="formData.b">
</form>
Dann könnte man tief beobachten (mit $watch
) für Modelländerungen (und anzuwenden, ohne dass debounce Option auf Elemente, die Sie benötigen):
$scope.$watch("formData", function(){
console.log("something has changed");
}, true);
Dann ist das Problem, natürlich, dass dies eine Deep-Watch ist und es teuer ist. Außerdem reagiert es nicht nur auf Änderungen in der Form, sondern auch auf eine Veränderung von einer beliebigen Quelle in formData
.
So könnten Sie als Alternative eine eigene Anweisung erstellen, um das Formular zu ergänzen und auf Änderungsereignisse des Formulars zu reagieren.
.directive("formOnChange", function($parse){
return {
require: "form",
link: function(scope, element, attrs){
var cb = $parse(attrs.formOnChange);
element.on("change", function(){
cb(scope);
});
}
}
});
und die Nutzung ist:
<form name="form1" form-on-change="doSomething()">
<input ng-model="formData.a">
<input ng-model="formData.b">
</form>
plunker zur Illustration.
Beachten Sie, dass die „change“ -Ereignis nur auf Blur für eine Texteingabe ausgelöst wird, wie pro jQuery documentation:
Das change
Ereignis zu einem Element gesendet wird, wenn sich sein Wert ändert. Diese Veranstaltung ist beschränkt auf <input>
Elemente, <textarea>
Boxen und <select>
Elemente.Bei Auswahlfeldern, Kontrollkästchen und Optionsfeldern wird das Ereignis sofort ausgelöst, wenn der Benutzer eine Auswahl mit der Maus trifft. Bei den anderen Elementtypen wird das Ereignis jedoch zurückgestellt, bis das Element den Fokus verliert.
Ich glaube, die beste Wahl, eine Richtlinie für alle Eingaben machen (die Sie wollen debounce auf) und stellen Sie die debounce dort einstellen , aber lass es das ng-Modell und andere Sachen aus deinen Eingaben bestehen. –