如何在运行时创建不带数据属性的剔除数据绑定

Posted

技术标签:

【中文标题】如何在运行时创建不带数据属性的剔除数据绑定【英文标题】:How to create knockout data bindings at runtime w/o data attributes 【发布时间】:2013-10-13 13:06:38 【问题描述】:

是否可以仅从 javascript 创建敲除绑定,即无需编写自定义 html 属性?

我非常坚持我们现有的标记,无法添加 knockout.js 所依赖的data-bind 等(html 是以编程方式生成的,无法访问渲染管道,请假设我已经筋疲力尽我尝试的选择:)

我暂时追求的一个想法是在调用ko.applyBindings 之前在运行时添加data-bind 属性。有首选方法吗?如果它还实现类似于 knockout.js if/visible 的绑定,我也会接受一个替代的、有充分记录/流行/稳定的框架。

【问题讨论】:

【参考方案1】:

Knockout 3.0(指日可待,现在处于候选版本中)开辟了lot more ways to interact with the binding process,例如预处理节点和动态生成绑定的能力。查看Knockout.Punches 以查看一些可能的示例。再加上已经提到的 unobtrusive 和 class 绑定提供程序,您应该可以轻松处理遇到的任何标记。

还可能值得指出的是,knockout 有一个 applyBindingsToNode 函数,如果你想要完全控制,它会接收绑定的 JSON 对象,尽管它不会将绑定应用于后代元素。

【讨论】:

打孔看起来很有用。尽管如此,我开始相信我所追求的是真的淘汰反模式 - 这意味着我实际上无法控制 MVVM 模式的“VM”部分:( 更具体地说,您无法控制视图,它是 MVVM 的 V 部分。我认为这种方法绝对是一条不太理想的路线——我认为你也已经意识到了。但是,如果真的无法修改 HTML,那么您别无选择,只能做一些不走寻常路的事情。【参考方案2】:

查看 Knockout 文档中“其他技术”下的“不显眼事件处理”部分。

【讨论】:

我不知道如何使用that - 它似乎提供了一种不显眼的方式来仅委托交互处理程序(click 等),而不是全套淘汰赛。 js 绑定,包括data-bind="value:whatever" 和条件。我错过了什么吗? 这不是答案。只要 Knockout 不更改其页面内容,这就是答案可能所在的方向。【参考方案3】:

Knockout 允许我们创建自定义绑定提供程序,我发现有几个库可以帮助您做到这一点

您可以在这里找到它们:

根本不使用 DOM:

https://github.com/tobio/knockout.unobtrusivebindingprovider

使用另一种方法的人:

https://github.com/rniemeyer/knockout-classBindingProvider

最后,如果它们都不适合您的需求,您可以使用 jQuery 修改 DOM,然后调用其上的绑定...

【讨论】:

unobtrusivebindingprovider 看起来很有用,尽管活动非常有限(FTFY:它确实使用 DOM,但它不使用标记进行数据绑定,这正是我所追求的)

以上是关于如何在运行时创建不带数据属性的剔除数据绑定的主要内容,如果未能解决你的问题,请参考以下文章

将标题从资源文件传递给剔除数据绑定属性

vue中的数据绑定

当通过网络接收的数据更改属性时,如何将控件绑定到属性更改?

如何使数据绑定类型安全并支持重构?

如何在数据绑定值更改时更新图像?

WPF:元素绑定