2016-12-02 6 views
0

私は単純なバインディングテストを行っています。ページが開くとInitとUpdateが呼び出されます。しかし、それを行う関数を呼び出すことによってobjervableを手動で更新すると、更新メソッドがバインディングハンドラで呼び出されていません。ノックアウトカスタムバインディングが監視対象に更新されない

だから、selectedQueueは2に設定されています。ボタンをクリックすると、選択項目の3番目の要素が正しく選択されます。しかし、私のバインディングハンドラはこの変更のために呼び出されていません。

シンプルなものがありますか?

<select id="productGroup" name="productGroupen" data-bind="value:selectedQueue, treeMenu: selectedQueue"> 
    <option value="1" selected="selected">Group 1</option> 
    <option value="2">Group 2</option> 
    <option value="3">Group 3</option> 
</select> 

<div data-bind="text: selectedQueue"></div> 

<button data-bind="click:setQueue">Set to 3</button> 

    <script src="~/Scripts/knockout-3.4.0.js"></script> 

    <script> 

     ko.bindingHandlers.treeMenu = { 
      init: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
       alert("init") 
       x = valueAccessor(); 
      }, 
      update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
       alert("update"); 
       x = valueAccessor(); 
      } 
     }; 


     var Model = function() { 
      self = this; 

      this.selectedQueue = ko.observable(2); 
      this.setQueue = function() { 
       this.selectedQueue(3); 

      } 

     } 
     $(document).ready(function() { 
      ko.applyBindings(new Model()); 
     }); 


    </script> 

答えて

0

消える問題以下のように私の場合は問題は2.2.1への私のノックアウトを変更ノックアウト-3.4

を使用していました。

<script src="http://knockoutjs.com/downloads/knockout-2.2.1.debug.js"></script> 

問題はないと考えられます。

0

ノックアウトのドキュメントは言う:結合が 要素に適用され、あなたがアクセスするすべての依存関係 (観測/ computeds)を追跡する場合

ノックアウトは最初の更新コールバックを呼び出します。これらの 依存関係のいずれかが変更されると、更新コールバックが再度呼び出されます。

そして、valueAccessor()は値が渡されるだけであるため、コードでは「実際の観測可能」にアクセスしていません。したがって、このファイルに依存関係は作成されず、updateは呼び出されません。

valueAccessor()ko.unwrapでラップするか、valueAccessor()()に電話して「実際に観察可能」にする必要があります。

update: function (element, valueAccessor, allBindings, viewModel, bindingContext) { 
    alert("update"); 
    x = ko.unwrap(valueAccessor()); 
} 
関連する問題