什么是Knockout自定义绑定""变量?

时间:2017-04-22 10:45:30

标签: knockout.js ko-custom-binding

我正在使用 knockout ASP.NET MVC 进行某些项目。
我正在使用以下bindingHandler淘汰赛

ko.bindingHandlers.select2 = {
    after: ["options", "value", "selectedOptions"],
    init: function (el, valueAccessor, allBindingsAccessor, viewModel) {
        // no explicit reference to the 'after' variable
    },
    update: function (el, valueAccessor, allBindingsAccessor, viewModel) {
        // no explicit reference to the 'after' variable
    }
}

我从this question获得了此代码并且我对其进行了少量修改。
对于Select2 plugin,它基本上是custom binding handler

问题
我只是想知道after: ["options", "value", "selectedOptions"],在这里意味着什么。 initupdate函数中的任何位置都没有引用此变量。
这个变量在这种情况下是否有任何意义?或者这是一个敲除指令,使其在完成执行[optionsvalueselectedOptions]绑定后执行此自定义绑定?

注意 custom binding的文档没有提到这个变量。

1 个答案:

答案 0 :(得分:2)

你是对的,因为它似乎没有证件。深入研究KO source code向我们展示了这一点:

// First add dependencies (if any) of the current binding
if (binding['after']) {
    cyclicDependencyStack.push(bindingKey);
    ko.utils.arrayForEach(binding['after'], function(bindingDependencyKey) {
        if (bindings[bindingDependencyKey]) {
            if (ko.utils.arrayIndexOf(cyclicDependencyStack, bindingDependencyKey) !== -1) {
                throw Error("Cannot combine the following bindings, because they have a cyclic dependency: " + cyclicDependencyStack.join(", "));
            } else {
                pushBinding(bindingDependencyKey);
            }
        }
    });
    cyclicDependencyStack.length--;
}

您的假设似乎是正确的。 KO正在构建一个必须在当前绑定运行之前运行的依赖绑定列表。内置的valueselectedOptions绑定会利用此关键字。

以下是discussion on implementation from the Knockout Github

以下是相关的StackOverflow answer

在该答案中查看JSFiddle以获取示例代码。