Knockout自定义绑定不触发更新为可观察
问题描述:
我有一个简单的绑定测试。初始化和更新在页面打开时被调用。但是,如果我通过调用一个函数来手动更新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>
答
在我的情况下,问题使用淘汰赛3.4
更改我的淘汰赛2.2.1如下问题消失了。
<script src="http://knockoutjs.com/downloads/knockout-2.2.1.debug.js"></script>
不知道问题出在哪。
答
淘汰赛文档说:
淘汰赛将首先调用更新回调时绑定是 应用于元素和跟踪你访问任何依赖 (观测/ computeds)。当这些 依赖关系中的任何一个发生更改时,更新回调将再次被调用。
而在您的代码中,您并未访问“实际可观察”,因为valueAccessor()
只能获得通过的值。因此在这一个上不会创建依赖关系,并且不会调用update
。
您需要将valueAccessor()
换成ko.unwrap
或致电valueAccessor()()
以获得“实际可观察”。
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
alert("update");
x = ko.unwrap(valueAccessor());
}