如果其中一个输入字段发生更改,我希望为整个表单执行等效的ng-change
。
我知道,因为AngularJS 1.3我有去抖动选项,但它仅适用于单个输入。
我正在寻找适用于整个表单的“debounce”/“on change”功能。
答案 0 :(得分:55)
没有内置的方法可以为表单执行ng-change
。
甚至可能不需要它,因为如果您正确组织了视图模型,那么表单输入可能会绑定到某个以范围暴露的属性:
$scope.formData = {};
并在视图中:
<form name="form1">
<input ng-model="formData.a">
<input ng-model="formData.b">
</form>
然后您可以深入观察(使用$watch
)模型更改(并对您需要的元素应用任何去抖动选项):
$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用于说明。
请注意,&#34;更改&#34;根据{{3}}
,仅在模糊文本输入时触发事件
change
事件在值更改时发送给元素。此活动仅限于<input>
元素,<textarea>
框和<select>
元素。对于选择框,复选框和单选按钮,当用户使用鼠标进行选择时会立即触发事件,但对于其他元素类型,事件将延迟,直到元素失去焦点。
答案 1 :(得分:7)
一个&#34; hacky&#34;这样做的方法是将观察者设置为脏的形式,根据您的要求有效,您可以执行类似
的操作 $scope.$watch('form.$dirty',function(v){
if(!v){return}
form.$setPristine()
/*do something here*/
})
这将在每次修改表单时执行,如果您只想在可以执行的有效修改表单上执行代码
if(!v || form.$invalid){return}
如果您只想在表单步入$ valid状态时执行代码,只需要设置您的观察者表单。$ valid&#39;
如果您不想使用观察者污染您的范围,您可以随时在表单周围创建一个指令,公开更改的api事件并在内部照顾观察者
答案 2 :(得分:7)
根据Eric Soyke的评论,您可以查看关键字事件的表单更改。
这样你就可以简单地使用内置指令ng-keyup:
<form name="form1" ng-keyup="doSomething()">
答案 3 :(得分:1)
好的,超级超级迟来的答案...但这很整洁
// html
<form name="$ctrl.form">...</form>
// controller
function $postLink() {
ctrl.form.$$element.on('change', function () {
console.log('fired');
});
}