自定义绑定到可观察数组而不调用更新函数

时间:2013-11-08 10:40:18

标签: javascript knockout.js

我有这个非常简单的绑定:

ko.bindingHandlers.chosen = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        console.log("INIT");
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        console.log("IT WORKS!");
    }
};

用于选择:

<select data-bind="
        options: Options,
        chosen: Options
    "></select>

Options声明为:

this.Options = ko.observableArray(opt1);

并在必要时更新,如下:

this.Options(newValues);

但是,"IT WORKS"只会被记录一次(当呈现选择列表时),而不再记录。见this jsfiddle。尝试按“重新加载”按钮:更新数组,重新呈现选择列表(耶!)但不调用自定义更新功能(不!)。我甚至试图强迫.valueHasMutated,但没有成功。

我需要更新功能才能正常工作。为什么不发生这种情况?

1 个答案:

答案 0 :(得分:4)

由于您未在更新功能中使用valueAccessor,因此未发生这种情况。如果您使用它,您将获得update函数:

ko.bindingHandlers.chosen = {
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        console.log("INIT");
    },
    update: function (element, valueAccessor, allBindingsAccessor, viewModel) {
        var value = ko.unwrap(valueAccessor());
        console.log("IT WORKS!");
    }
};

这是更新的小提琴:http://jsfiddle.net/wzTg4/8/