2016-12-02 129 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()); 
}