2015-02-23 55 views
29

每當其中一個輸入字段發生變化時,我想爲整個表單做一個等效的ng-changeng整個表單的類似ngChange的功能

我知道,自從AngularJS 1.3我有debounce選項,但它只適用於單個輸入。

我正在尋找適用於整個表單的「debounce」/「on change」功能。

+1

我認爲最好的辦法是做一個指導你所有的輸入(您想在防抖),並設置去抖設置有,但讓它通過你的輸入ng模型和其他東西。 – 2015-02-23 16:10:12

回答

49

沒有內置的API,在做表格的方式做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用於說明。

注意的是,「改變」事件僅在模糊的文本輸入解僱,按照jQuery documentation:

change事件時發送到一個元素的值發生變化。此事件限於<input>元素,<textarea>框和<select>元素。對於選擇框,複選框和單選按鈕,當用戶使用鼠標進行選擇時,會立即觸發事件,但對於其他元素類型,事件將被推遲直到元素失去焦點。

+1

您還可以通過偵聽該指令中的鍵盤事件來檢測文本輸入更改,請添加:'element.bind(「keydown keypress」,function(event){ cb(scope); });' – 2016-06-21 19:49:07

+0

它是否也是可能排除某些類型(輸入,選擇,按鈕等)?我添加了點擊事件,並試圖排除按鈕類型。我可以看到用console.log記錄的按鈕(attrs); – 2018-01-19 13:30:38

7

一個「哈克」的方式來做到這一點是一個觀察者設置形式髒,有效的根據您的要求,你可以這樣做

$scope.$watch('form.$dirty',function(v){ 
     if(!v){return} 
     form.$setPristine() 
     /*do something here*/ 
    }) 

這將執行每次的形式被修改,如果你只希望有效改進形式對執行代碼,你可以做

 if(!v || form.$invalid){return} 

,如果你只希望在表格步驟$有效狀態只需要設置您的觀察者對「的形式來執行你的代碼。$有效'

如果你不喜歡用觀察者污染你的範圍,你總是可以創建一個指令來圍繞表單顯示一個on-change api事件,並在內部照顧觀察者

6

根據Eric Soyke的評論,您可以勾選keyup事件中窗體更改的檢查。

這種方式,你可以簡單地使用內置的指令NG-KEYUP:

<form name="form1" ng-keyup="doSomething()"> 
+0

+1 這是我需要的答案,因爲New Dev的解決方案只有在重點丟失(如他已經提到的)時才起作用,這不會給我想要的用戶體驗。 Ty雖然:) – 2016-10-10 15:14:52

+1

不適用於自動填充插件(除非它們觸發了按鍵事件)。 – setec 2016-11-14 12:17:00

+0

這不會使用鼠標粘貼。 – Dementic 2017-03-10 16:38:35