我是否错误地构建了绑定处理程序?

时间:2014-10-23 18:46:39

标签: knockout.js custom-binding

在我的所有淘汰自定义绑定处理程序中,我总是省略更新回调。我的理由是我可以在init回调中完成我需要完成的所有工作。在那里,我可以创建计算器,调用applyBindingsToNode(如果需要)或设置可订阅的手动订阅,并在这些订阅中进行我的DOM操作。

我担心的是,敲除中的默认绑定仅使用更新回调构建。更新:不再,值和其他一些绑定现在只使用init)在init回调中完成所有工作有什么缺点吗?有什么我想念的吗?谢谢!

2 个答案:

答案 0 :(得分:1)

从版本3.0开始,Knockout完全支持在init函数中创建计算和订阅。这是一种比使用update更先进的技术,因为这意味着您需要更加谨慎,以确保您捕获并响应所有依赖项,以及在正确的时间处置订阅。

作为参考,update函数本身在Knockout中处理得非常简单(为清晰起见略微修改):

var handlerUpdateFn = handler.update;
if (typeof handlerUpdateFn == "function") {
    ko.computed(
        function () {
            handlerUpdateFn(node, getValueAccessor(bindingKey), allBindings, 
                bindingContext.$data, bindingContext);
        },
        null,
        { disposeWhenNodeIsRemoved: node }
    );
}

答案 1 :(得分:0)

您正在使用计算和订阅替换绑定处理程序的更新机制,因此在创建自定义绑定处理程序时这显然不是最佳做法,否则将不会有更新功能。

除了违反最佳做法之外,您只是通过添加订阅和不需要的计算来创建更多开销。将为您执行绑定处理程序流程。 Knockout已经在评估发送到绑定处理程序并为您执行更新功能的表达式。所以除此之外,添加计算机和订阅很可能会导致意外行为。可能存在某种程度上需要这种情况的情况,但根本不使用内置更新机制只会导致问题和混淆。