Ответ 1
Для формы не существует встроенного способа ng-change
.
Это может даже не понадобиться, потому что, если вы правильно организовали свою модель представления, то ваши входы формы, вероятно, связаны с определенным областью видимости:
$scope.formData = {};
и в представлении:
<form name="form1">
<input ng-model="formData.a">
<input ng-model="formData.b">
</form>
Затем вы можете глубоко (с помощью $watch
) просмотреть изменения модели (и применить любую опцию debounce для элементов, которые вам нужны):
$scope.$watch("formData", function(){
console.log("something has changed");
}, true);
Тогда проблема, конечно, что это глубокие часы, и это дорого. Кроме того, он реагирует не только на изменения в форме, но и на изменение formData
из любого источника.
Итак, в качестве альтернативы вы можете создать свою собственную директиву, чтобы дополнять форму и реагировать на изменения событий.
.directive("formOnChange", function($parse){
return {
require: "form",
link: function(scope, element, attrs){
var cb = $parse(attrs.formOnChange);
element.on("change", function(){
cb(scope);
});
}
}
});
а использование:
<form name="form1" form-on-change="doSomething()">
<input ng-model="formData.a">
<input ng-model="formData.b">
</form>
plunker для иллюстрации.
Обратите внимание, что событие "change" запускается только при размывании текстового ввода, согласно документации jQuery:
Событие
change
отправляется элементу при изменении его значения. Это событие ограничено<input>
элементами,<textarea>
и<select>
элементами. Для флажков выбора, флажков и переключателей событие запускается немедленно, когда пользователь делает выбор с помощью мыши, но для других типов элементов событие откладывается до тех пор, пока элемент не теряет фокус.