2016-12-02 126 views
0

我有一個簡單的綁定測試。初始化和更新在頁面打開時被調用。但是,如果我通過調用一個函數來手動更新objervable,則更新方法不會在我的綁定處理程序中調用。Knockout自定義綁定不觸發更新爲可觀察

它以selectedQueue設置爲2開始。單擊該按鈕正確選擇select中的第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

在我的情況下,問題使用淘汰賽3.4

更改我的淘汰賽2.2.1如下問題消失了。

<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()); 
}