2

我在某些项目中使用带有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
    }
}

我从这个问题中得到了这段代码,我对其进行了少许修改。
它基本上是一个custom binding handler用于Select2 的插件

问题
我只想知道after: ["options", "value", "selectedOptions"],这里的意思。在initorupdate函数中的任何地方都没有对这个变量的引用。
这个变量在这种情况下有什么意义吗?或者这是一个淘汰指令,使其在完成执行 [ options, value, selectedOptions] 绑定后执行此自定义绑定?

请注意,自定义绑定 的文档没有提及此变量。

4

1 回答 1

2

你是对的,它似乎没有记录。深入研究KO 源代码向我们展示了这一点:

// 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绑定利用了这个关键字。

这是来自 Knockout Github 的关于实现的讨论

这是一个相关的StackOverflow 答案

有关示例代码,请参见该答案中的 JSFiddle。

于 2017-04-22T17:30:42.163 回答