【问题标题】:Unobtrusive Knockout不显眼的淘汰赛
【发布时间】:2012-11-07 05:36:59
【问题描述】:

我最近熟悉了 Knockout,我认为这是一个很棒的框架。不过我有一个担心。

我发现在非平凡的绑定案例中,我的视图(标记)中潜入了 javascript 代码的 sn-ps。事实上,Knockout 文档中的不少代码示例也证明了这一点。

这会让 Knockout 天生就显得突兀吗?

我应该接受它的本质而不是在实践中担心吗?

或者我应该采用什么模式/技术来使 Knockout 不引人注目?

【问题讨论】:

    标签: javascript knockout.js unobtrusive-javascript


    【解决方案1】:

    对于所选答案中建议的绑定提供程序,另一种选择是 knockout.unobtrusiveBindingProvider,它是“用于 Knockout JS 的不显眼的、基于约定的绑定提供程序,可以清晰地分离 HTML 和 Knockout 数据绑定”。

    【讨论】:

      【解决方案2】:

      很好的问题。我一直在写复杂的 KnockoutJS 视图,直到我切换到Ryan Niemeyer's class binding provider 才感到满意。

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

      查看example TodoMVC app

      【讨论】:

      • 您可能还对我正在开发的一些嵌套功能感兴趣。您可以在此处查看拉取请求:github.com/rniemeyer/knockout-classBindingProvider/pull/15
      • 这里我会比较简单,html5数据属性中的一点元数据没有错
      • 安德斯,你指的是什么?
      • 添加第 4 层只是为了从 html 中抽象一些元数据,data-bind="binding: value" 几乎不是突兀的 javascript。
      • 当然,这对于小型 Knockout 应用程序来说有点过头了,但还有其他几个很好的理由。见here
      【解决方案3】:

      我应该接受它的本质而不是在实践中担心吗?

      我的理解是,“不引人注目”意味着一些不同的东西。

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

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

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

      【讨论】:

        【解决方案4】:

        尝试将 Javascript 排除在绑定之外,仅将其用于元数据

        所以而不是这样做

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

        使用计算的 observable

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

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

        你正在做&lt;button data-name="save"&gt;Save&lt;/button&gt;,而不是&lt;button data-bind="click: save"&gt;Save&lt;/button&gt;。该库将按照约定理解您要将保存功能连接到按钮单击处理程序。按照惯例,如果存在 canSave 成员,它也会绑定启用。 http://jsfiddle.net/3Ajnj/15/

        【讨论】:

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

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

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

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

        【讨论】:

        • 请在您的答案中包含一个摘要(或考虑将其作为评论发布),以防止链接失效使此答案过时。
        猜你喜欢
        • 1970-01-01
        • 2014-08-14
        • 1970-01-01
        • 2013-04-10
        • 1970-01-01
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 2016-11-25
        相关资源
        最近更新 更多