2013-02-05 11 views
7

ノックアウトカスタムバインディングはどのようにobservableArrayで動作しますか?カスタムバインディングでko.observable()を使用すると、すべて正常に動作します。 ko.observableArray()を使用すると、初期イベント(initおよびupdate once)のみがスローされますが、それ以上の変更は検出されません(Fiddleまたは下記のコードを参照)。ko.observableArray()でカスタムバインディングを使用する方法

<!DOCTYPE html> 
<html> 
<head> 
    <script type="text/javascript" src="knockout-2.2.1.js"> </script> 
</head> 
<body> 
    <div data-bind="text: Observable, updateBinding: Observable"></div> 
    <div data-bind="foreach: ObservableArray, updateBinding: ObservableArray"> 
     <span data-bind="text: $data"></span> 
    </div> 
    <script type="text/javascript"> 
     ko.bindingHandlers['updateBinding'] = { 
      init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       alert("Binding Handler (Init)"); 
      }, 
      update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
       alert("Binding Handler (Update)"); 
      } 
     }; 

     function ViewModel() { 
      var self = this; 

      self.ObservableArray = ko.observableArray(); 
      self.Observable = ko.observable(); 
     } 

     var viewModel = new ViewModel(); 

     // Fires Init + Update for Observable and ObservableArray 
     ko.applyBindings(viewModel); 

     // Fires Update for Observable 
     viewModel.Observable(1); 

     // Does nothing 
     viewModel.ObservableArray.push('1'); 
    </script> 
</body> 
</html> 

答えて

8

カスタムバインディング内でobservableArrayに依存関係を作成したいと思うでしょう。だから、のような非常に少なくとも何かを:単一の要素上のすべてのバインディングが一緒に(詳細here)をトリガーしているため

ko.bindingHandlers.updateBinding = { 
     init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      alert("Binding Handler (Init)"); 
     }, 
     update: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
      //create a dependency, normally you would do something with 'data' 
      var data = ko.utils.unwrapObservable(valueAccessor()); 
      alert("Binding Handler (Update)"); 
     } 
    }; 

これはあなたの観察可能な例を用いて動作することを理由です。

他のバインディングでこれが同じように動作しない理由は、foreachが異なる動作をするためです。 observableArrayを変更しても、foreachバインディングが直接トリガーされることはありません(または、セクション全体が再レンダリングされます)。代わりに、アレイがどのように変化したかを評価し、必要な増分更新(アイテムの追加、アイテムの削除など)を行う別のko.computedでロジックをトリガします。

+0

ありがとう、面白い情報 - これらは私がknockoutjsのドキュメントで期待する情報です - 少なくとも私たちは次のようなものを持っています:) – Dresel

関連する問題