2016-12-21 26 views
0

我有一個角1.5(與組件)的應用程序。在部件之一,我有一個本地對象定義爲:角度1.5分量跟蹤對象變化

model.user = { 
    firstName: 'John', 
    lastName: 'Smith' 
} 

然後在標記我用它作爲:

<input class="field" ng-model="model.user.firstName" /> 

我想要做的是,當用戶進行跟蹤更改爲此字段並記錄事件。我花了一些時間尋找不同的選項,但我想問問使用組件時建議的方法。這是我到目前爲止發現的:

  • $ watch(...) - 這很好,因爲我得到了舊的和新的值,但似乎這種方法是不鼓勵的。
  • $ onChanges - 這不起作用,因爲這是一個本地對象。
  • $ doCheck - 這可能有效,但我沒有得到任何有關更改對象的信息。我必須手動跟蹤以前的值。
  • ng-change - 這會起作用,但我有很多字段,並且維護標記可能會變得有點困難。

我正在尋找像Telerik的劍道MVVM的方法。在那裏,我可以將任何對象的更改事件綁定到函數,並檢索已更改的字段,舊的和新的值。這種方法的優點在於,如果我的對象發生變化,我不必對代碼進行任何更改,但更改事件將會選擇新的字段,而無需編寫任何代碼。更清潔,更容易維護。

這是可能的角度1.5與組件?如果是這樣,那麼推薦的方法是什麼?

謝謝。

+1

'ng-change'不需要任何'$ watch'es,所以它在性能方面效果最好。我不確定你通過維護標記是指什麼問題,因爲如果你沒有這樣做,那麼只需花費更多的時間在控制器中維護javascript即可。或者我錯過了你的具體關注點? – CShark

+0

謝謝@CShark。例如,當我使用kendo observables進行工作時,一旦我在對象的「change」事件處理程序中編寫代碼,如果向該對象添加或刪除字段,則不需要觸摸它。我也不必在標記中提及它。如果我使用ng-change,我將不得不確保每個需要跟蹤的字段都有正確的代碼。隨着解決方案的增長,這可能變得更難以管理。正如你所猜測的那樣,我正在大量使用kendo ui :)而且我希望Angular能夠使用類似的機制。 – dpdragnev

回答

1

正如@CShark所建議的,ng-change方法是最好的選擇。爲了保持更簡潔的標記我創建了一個注入一個自定義屬性指令中的NG-模式選項和NG-改變屬性:

module.directive('inputChanged', function ($compile) { 
 
     function link(scope, element, attrs) { 
 
      var field = attrs.ngModel; 
 
      if (field) { 
 
       element.removeAttr('input-changed'); 
 
       element.attr('ng-model-options', "{ updateOn: 'blur' }"); 
 
       var fn = "model.changed('" + field + "', " + field + ", '{{ " + field + " }}')"; 
 
       element.attr('ng-change', fn); 
 

 
       $compile(element)(scope); 
 
      }  
 
     } 
 

 
     return { 
 
      restrict: 'A', 
 
      link: link, 
 
      terminal: true, 
 
      priority: 1000 
 
     } 
 
    });

在我的模型,我有:

model.changed = function (field, newValue, oldValue) { 
 
    //log the change 
 
}

此過程完成後,只需添加輸入瓚ged屬性添加到具有ng-model屬性的任何元素。例如。

<input ng-model="model.user.firstName.value" input-changed />

注意,我只捕捉變化,一旦用戶已經通過設置NG-模型選項所犯下的變化。另外請注意,我正在將舊值和新值傳遞給model.changed函數。這樣,我可以在沒有使用$ watch的情況下獲得類似於手錶的功能。

我不確定這是否是最好的解決方案,但它會在我的情況下。