我有一个简单的绑定测试。页面打开时将调用Init和Update。但是如果我通过调用一个函数手动更新objervable来执行它,则不会在我的绑定处理程序中调用update方法。
所以它从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 :(得分:0)
在我的情况下,问题是使用knockout-3.4
将我的淘汰赛更改为2.2.1,因为问题消失了。
<script src="http://knockoutjs.com/downloads/knockout-2.2.1.debug.js"></script>
不知道问题是什么。
答案 1 :(得分:0)
Knockout文档说:
Knockout最初会在绑定时调用更新回调 应用于元素并跟踪任何依赖项 您可以访问的(observables / computeds)。当这些中的任何一个 依赖关系发生变化,将再次调用更新回调。
在您的代码中,您无法访问&#34;实际可观察的&#34;但因为valueAccessor()
只传递了值。因此,不会对此创建依赖关系,并且不会调用update
。
您需要使用valueAccessor()
打包ko.unwrap
或致电valueAccessor()()
以获得&#34;实际可观察的&#34;。
update: function (element, valueAccessor, allBindings, viewModel, bindingContext) {
alert("update");
x = ko.unwrap(valueAccessor());
}