Knockout自定义绑定不会触发Update to observable

时间:2016-12-02 00:17:05

标签: javascript knockout.js

我有一个简单的绑定测试。页面打开时将调用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>

2 个答案:

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