不显眼的敲除

Unobtrusive Knockout

提问人:Brett Postin 提问时间:11/19/2012 更新时间:8/8/2016 访问量:3354

问:

我最近开始接触 Knockout,我认为这是一个很棒的框架。但是,我有一个担忧。

我发现在非平凡的绑定情况下,我有 javascript 代码片段潜入我的视图(标记)。事实上,Knockout 文档中的许多代码示例也演示了这一点。

这是否使 Knockout 本身就显得突兀?

我应该接受它的本来面目,而不是在实践中担心吗?

或者我应该采用任何模式/技术来使 Knockout 不显眼?

javascript knockout.js unobtrusive-javascript

评论


答:

16赞 Anders 11/19/2012 #1

尽量将 Javascript 排除在绑定之外,只将其用于元数据

所以而不是做

<span data-bind="visible: errors().length > 0">You have errors</span>

使用计算的可观察对象

<span data-bind="visible: hasErrors">You have errors</span>

更新:我继续为 KO 创建了一个约定配置API可以在这里找到它 https://github.com/AndersMalmgren/Knockout.BindingConventions/wiki

而不是做你在做.按照约定,库将理解您要将保存函数连接到按钮单击处理程序。按照惯例,如果存在 canSave 成员,它也会绑定 enable。http://jsfiddle.net/3Ajnj/15/<button data-bind="click: save">Save</button><button data-name="save">Save</button>

评论

1赞 Mike B 12/11/2012
这种方法有助于清理问题,但它不能解决难以调试的绑定错误,或者在构建更大的 KO 应用程序时,你最终可能会大量复制绑定代码的事实。
0赞 Anders 12/11/2012
好吧,我能看到使用您的方法的唯一原因是在多个元素上重用一组绑定。但是,在单独的 JS 对象中指定每个小绑定听起来非常麻烦,实际上破坏了 MVVM 的一些优势。
1赞 Mike B 12/11/2012
我想指出的例子是内联样式。它们是快速设置小块标记样式的最快方法,但它们不可维护。就像外部样式表一样,通过从 html 中删除 Knockout 绑定,您可以获得更好的可维护性。
0赞 Anders 7/11/2014
错过了你在那里的最后一条评论。(得到了赞成,所以这就是我看到它的原因)上面的 lib 使您能够重用和分组绑定。您只需创建自己的约定
21赞 Mike B 11/20/2012 #2

好问题。我编写复杂的 KnockoutJS 视图已经有一段时间了,直到我切换到 Ryan Niemeyer 的类绑定提供程序之前,我才感到满意。

Knockout ClassBindingProvider 允许您在 JavaScript 对象中声明绑定,然后从类似于 css 类工作方式的属性中引用它们。效果很好!data-class

请参阅 TodoMVC 应用示例

评论

0赞 Mike B 11/21/2012
您可能还对我正在开发的一些嵌套功能感兴趣。您可以在此处查看拉取请求:github.com/rniemeyer/knockout-classBindingProvider/pull/15
0赞 Anders 11/21/2012
我在这里会简单一点,html5 数据属性中的一些元数据没有错
0赞 Mike B 11/21/2012
安德斯,你指的是什么?
0赞 Anders 11/22/2012
要添加第 4 层只是为了从 html 中抽象出一些元数据,data-bind=“binding: value” 几乎不是突兀的 javascript。
2赞 Mike B 11/22/2012
当然,对于小型 Knockout 应用程序来说,这有点矫枉过正,但还有其他几个很好的理由。看这里
4赞 Peter Goodheart 8/26/2013 #3

我建议你,如果你还没有这样做,你可以访问 Ryan 的博客并阅读:“在 KnockoutJS 中简化和清理视图”......

http://www.knockmeout.net/2011/08/simplifying-and-cleaning-up-views-in.html

它解释了一些重构代码的好方法,因此它不会使 html 混乱并使其更干净。

评论

2赞 Jeroen 8/26/2013
还请在您的答案中包含摘要(或考虑将其作为评论发布),以防止链接腐烂使此答案过时。
5赞 Mike Bell 3/20/2014 #4

我应该接受它的本来面目,而不是在实践中担心吗?

我的理解是,“不显眼”意味着一些不同的东西。

“不显眼”的一个方面是,网站应该在对 JavaScript 支持有限或根本没有支持的浏览器上维护核心功能。为此,你对这一原则的关注应该取决于你的目标受众。我曾经参与过一些项目,我非常了解我的目标受众,以至于我可以说,“如果你想利用这个网络应用程序,请使用像 Chrome 这样启用了 JavaScript 的现代浏览器。在这种情况下,请随意使用最新、最出色的前端框架。

我曾参与过其他项目,但情况并非如此,我们必须非常小心地使用像 Knockout 这样的框架。如果您严重依赖 Knockout 来执行应用程序中的核心功能,那么您的应用程序本质上是突兀的。这是否应该打扰你取决于你的目标受众。

“不显眼的 JS”的另一个原则是 JavaScript 和 HTML 之间的关注点分离。实际上,我争论的是这个原则有多严格。我认为一个更重要的原则是按照 MVVM 模式将视图模型逻辑和显示逻辑之间的关注点分开。Knockout 在鼓励视图/虚拟机关注点的干净分离方面做得非常出色,即使您在数据绑定中放置了一些 JavaScript 逻辑。只要是严格的观点逻辑,我觉得其实就属于观点。

1赞 Steven Bey 8/8/2016 #5

除了所选答案中建议的绑定提供程序之外,另一种方法是 knockout.unobtrusiveBindingProvider,它是“一个不显眼的、基于约定的 Knockout JS 绑定提供程序,可实现 HTML 和 Knockout 数据绑定的干净分离”。