【问题标题】:When required Knockoutjs custom binding需要时 Knockoutjs 自定义绑定
【发布时间】:2015-07-27 11:50:54
【问题描述】:

正在努力学习 Knockoutjs。我找到了一个 Knockoutjs 自定义绑定相关的代码,但这不是很好。

<input data-bind="value: name" />
<hr/>
<div data-bind="fadeInText: name"></div>

ko.bindingHandlers.fadeInText = {
    update: function(element, valueAccessor) {
        $(element).hide();
        ko.bindingHandlers.text.update(element, valueAccessor);
        $(element).fadeIn(); 
    } 
};

var viewModel = {
    name: ko.observable("Bob")
};

ko.applyBindings(viewModel);

我只是不明白人们何时使用自定义绑定?

1) 如果可能的话,请告诉我在什么情况下可以选择自定义绑定?

2) 如果有人看到代码,那么他们可以理解自定义绑定 fadeInText 和 viewModel 没有关系,但它仍然可以工作。怎么样?

3) 如果会有多个视图模型,那么我如何在绑定时指定视图模型名称和绑定名称?

上述代码的jsfiddle链接http://jsfiddle.net/rniemeyer/SmkpZ/

4) 如何在没有自定义绑定的情况下实现相同的输出?有可能吗?

请明智地回答我的问题。谢谢

【问题讨论】:

  • 这是我不久前写的一篇文章,可能对您的一些问题有所帮助:knockmeout.net/2011/07/another-look-at-custom-bindings-for.html
  • @RPNiemeyer 好文章,顺便说一句。帮助我真正开始使用自定义绑定。
  • 自定义处理程序的原因?纯度。视图模型不应该直接进行任何视图操作(即 DOM 的东西)。它应该只操纵数据/模型本身。绑定处理程序将任何 DOM 操作(和 jQuery 内容)与 viewModel 隔离开来,从而使其保持纯净且更具可测试性。
  • 任何人都可以看到我发布的代码并告诉我如何在没有自定义绑定的情况下完成相同的任务.....想法将不胜感激。谢谢

标签: knockout.js ko-custom-binding


【解决方案1】:

这里有几个答案:

  1. 自定义绑定在许多情况下都很有用,在我看来,不应将其用作最后的手段。任何时候如果您想以内置绑定尚不支持的方式连接您的 DOM 和数据,那么它们是一个不错的选择。正如我在上面列出的,here 是一篇可以帮助澄清的文章。

  2. 自定义绑定通过调用ko.bindingHandlers.text.update间接与视图模型建立关系。因此,它有效地包装了实际的 text 绑定。 text 绑定读取传入的值并显示。

  3. 对于多视图模型,answer 描述了处理多视图模型的一些选项。

  4. 如果没有自定义绑定,您可以选择不使用 jQuery 并使用 CSS(考虑浏览器支持和前缀)。例如,您可以立即向元素添加一个类,例如:

使用 CSS 类似:

.message {
    opacity: 0;
    transition: opacity 2s ease-in;
}

.load {
    opacity: 1;
}

该元素将以 opacity: 0 开头,并在 2 秒内立即转换为 opacity: 1

我不建议在您的视图模型中直接使用 jQuery。自定义绑定是适用于这些场景的工具,并提供了 Knockout 提供的大部分功能。

希望这会有所帮助。

【讨论】:

  • subscribe 呢?
  • @Invent-Animate - 对不起,我没有关注。使用.subscribe 对变化做出反应?
  • 好吧,在文档中确实说“对于高级用户,如果您想注册自己的订阅以收到可观察的更改通知,您可以调用他们的订阅功能。”...我是或多或少的“探索”而不是建议
  • @Invent-Animate - 当然,在update 函数中访问的任何可观察对象都将自动成为依赖项,但您可以在init 函数中将自己的subscribe 设置为特定的可观察对象。您还想清理该订阅。希望这是有道理的!
  • 我想另一方面是,如果您使用subscribeelement 是否在范围内?我想这将是 OP 问题的主要要点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-02
  • 2018-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多