提问人:Brett Postin 提问时间:11/19/2012 更新时间:8/8/2016 访问量:3354
不显眼的敲除
Unobtrusive Knockout
问:
我最近开始接触 Knockout,我认为这是一个很棒的框架。但是,我有一个担忧。
我发现在非平凡的绑定情况下,我有 javascript 代码片段潜入我的视图(标记)。事实上,Knockout 文档中的许多代码示例也演示了这一点。
这是否使 Knockout 本身就显得突兀?
我应该接受它的本来面目,而不是在实践中担心吗?
或者我应该采用任何模式/技术来使 Knockout 不显眼?
答:
尽量将 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>
评论
好问题。我编写复杂的 KnockoutJS 视图已经有一段时间了,直到我切换到 Ryan Niemeyer 的类绑定提供程序之前,我才感到满意。
Knockout ClassBindingProvider 允许您在 JavaScript 对象中声明绑定,然后从类似于 css 类工作方式的属性中引用它们。效果很好!data-class
请参阅 TodoMVC 应用示例。
评论
我建议你,如果你还没有这样做,你可以访问 Ryan 的博客并阅读:“在 KnockoutJS 中简化和清理视图”......
http://www.knockmeout.net/2011/08/simplifying-and-cleaning-up-views-in.html
它解释了一些重构代码的好方法,因此它不会使 html 混乱并使其更干净。
评论
我应该接受它的本来面目,而不是在实践中担心吗?
我的理解是,“不显眼”意味着一些不同的东西。
“不显眼”的一个方面是,网站应该在对 JavaScript 支持有限或根本没有支持的浏览器上维护核心功能。为此,你对这一原则的关注应该取决于你的目标受众。我曾经参与过一些项目,我非常了解我的目标受众,以至于我可以说,“如果你想利用这个网络应用程序,请使用像 Chrome 这样启用了 JavaScript 的现代浏览器。在这种情况下,请随意使用最新、最出色的前端框架。
我曾参与过其他项目,但情况并非如此,我们必须非常小心地使用像 Knockout 这样的框架。如果您严重依赖 Knockout 来执行应用程序中的核心功能,那么您的应用程序本质上是突兀的。这是否应该打扰你取决于你的目标受众。
“不显眼的 JS”的另一个原则是 JavaScript 和 HTML 之间的关注点分离。实际上,我争论的是这个原则有多严格。我认为一个更重要的原则是按照 MVVM 模式将视图模型逻辑和显示逻辑之间的关注点分开。Knockout 在鼓励视图/虚拟机关注点的干净分离方面做得非常出色,即使您在数据绑定中放置了一些 JavaScript 逻辑。只要是严格的观点逻辑,我觉得其实就属于观点。
除了所选答案中建议的绑定提供程序之外,另一种方法是 knockout.unobtrusiveBindingProvider,它是“一个不显眼的、基于约定的 Knockout JS 绑定提供程序,可实现 HTML 和 Knockout 数据绑定的干净分离”。
评论