【问题标题】:Am I incorrectly building binding handlers?我是否错误地构建了绑定处理程序?
【发布时间】:2014-10-25 00:45:09
【问题描述】:

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

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

【问题讨论】:

  • 这样做没有问题,3.0之后的一些内置绑定现在使用那个结构(withif,和ifnot在3.1和value例如,在 3.2 中)。记得清理一下:knockmeout.net/2014/10/knockout-cleaning-up.html
  • 谢谢瑞恩,感谢您的回答!我一直想深入研究代码以确定 KO 是如何决定调用更新回调的。我猜它只是查看在 init 回调中观察到的内容。对我来说,我更喜欢对何时调用更新进行非常精细的控制。此外,大多数时候我的自定义绑定处理程序只是清理大量内置绑定。在这些情况下,我最终还是使用了 applyBindingsToNode,而这只能在 init 中完成。
  • yes-update 被包装在一个计算中,因此它跟踪在执行时访问的依赖项。因此,如果可以创建自己的计算来获得更大的控制权。只需传递disposeWhenNodeIsRemoved: element 选项和/或使用ko.utils.domNodeDisposal.addDisposeCallback(至少需要处理任何手动订阅)。
  • 谢谢,我已经使用addDisposeCallback 很长时间了。我从来没有见过任何关于 disposeWhenNodeIsRemoved 的东西,我现在就去看看吧
  • 在这里找到关于 disposeWhenNodeIsRemoved 的信息 knockmeout.net/2012/06/… :)

标签: knockout.js custom-binding


【解决方案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 }
    );
}

【讨论】:

  • 太棒了!因此,如果您不提供更新回调,淘汰赛甚至不会创建计算?
  • 太棒了,我真的希望是这样,你帮我省了一点挖掘 :) 谢谢!爱 3.2 顺便说一句
  • 无论是否支持,在大多数情况下都没有必要使事情复杂化。这个问题并不意味着需要更精细的控制。该问题询问在 init 的更新中做可以做的事情是否有任何问题。我仍然认为这个问题的答案是肯定的,这是错误的。如果您可以使用内置更新,则没有理由使事情复杂化,因为正如 Michael 所说,“您需要更加小心,以确保您正在捕获并响应所有依赖项”。在大多数情况下,没有必要增加这种复杂性和风险。
  • 这些绝对是需要注意的警告。在大多数情况下,我的自定义绑定包括手动调用 applyBindingsToNode 和很多我不想弄乱我的 html 的绑定。无论如何,这种工作应该只在 init 中完成。
【解决方案2】:

您正在用计算和订阅替换绑定处理程序的更新机制,所以是的,这显然不是创建自定义绑定处理程序时的最佳实践,否则将没有更新功能。

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

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多