Knockout.js是否与内容/ UI /行为分离最佳实践内联?

时间:2013-12-04 09:34:49

标签: html knockout.js code-separation

我已经在网上工作了很长时间,我看到了“最佳实践”的发展。我现在相当确信分离HTML(内容),Javascript(行为)和CSS(UI)是最好的事情。

几个月前,我开始使用knockout.js。我确实在其他类似的框架中选择了它,比如骨干或角度,因为我跟随的MVC训练的一章是关于淘汰赛,这个概念诱惑了我。然后在网上进行快速比较之后,对我的需求和开始来说,它看起来并不是一个糟糕的选择。

但是这是我的问题:当我现在查看我的HTML代码时,经过几个星期的开发项目后,其中有很多淘汰赛绑定,这让我想起了很多关于旧时代的事情,当时我们(或至少我)曾经通过onclick属性等来处理内联javascript事件处理。

因此,这两个问题,我不确定是100%适合SO,但我找不到更好的StackExchange网站来问它:

  1. 与“分离规则”相反,使用淘汰赛(或其他框架,因为它们似乎基本上都使用相同的模式)?或者这个规则是否可以接受?或者它是否完全可以接受,因为它使用“数据 - ”属性?

  2. 在这种情况下,这可能是一种不好的做法,是否有可能通过单独的javascript文件进行所有绑定,例如使用jQuery来选择控件并对它们应用绑定?如果不可能在淘汰赛中,它是否与另一个框架?我必须承认,在我做出选择的时候,我没有考虑过这种影响...

  3. 谢谢,对不起,如果这应该移到另一个SE网站。

3 个答案:

答案 0 :(得分:1)

我有与你相同的初始保留,但我不得不说在html中使用绑定而不是隐藏在JS文件中似乎对我来说好多了,因为表示和功能之间的链接现在已经非常明显了。它大大降低了更改某些HTML和破坏功能的可能性,因为您不知道有人使用jQuery将某些javascript连接到元素。

另外,正如你所指出的那样,我认为使用data-bind属性意味着它确实遵守了分离规则,但是如果你想要严格遵守它,那么确保所有绑定都是可观察的,在视图模型上计算或运行,不要使用任何代码(即检查两个可观察对象的状态的可见绑定)。我不确定我会把它拿走那么远。

答案 1 :(得分:1)

我想每个人都开始学习KnockoutJS有同样的担忧。

恕我直言,必须有一些方法将模型(JS对象)与视图(HTML标记)连接起来。然后我们应该说:“单击该按钮时,请使用该参数调用此函数。”或者“当JS数组为空时隐藏此元素”,依此类推。那么我们如何以可读,可重用和清晰的方式表达/说明/陈述该连接。

如果您使用另一个JS文件来处理该连接,那么您将拥有大量代码来放置您的连接逻辑,并且您需要知道如何选择您要定位的DOM元素。你最终会得到大量的代码(可能是很多jQuery)只是为了让你的HTML动态和活着(我敢打赌大多数开发人员进入了很多次)。我没有使用其他库或框架,但我认为它们只是使您的大量代码更有条理。

另一方面,KnockoutJS使用Declarative Bindings,这是模型和视图之间的链接。它更易读,更容易插入/插入,它让你专注于编写一个好的JS模型对象。

我想要真正检查分离,如果您需要更改模型,需要对视图进行多少更改?反之亦然?

答案 2 :(得分:0)

添加其余答案,一些提示:

确保绑定中没有业务逻辑。任何逻辑(应该是最小的)应该是“查看逻辑”:仅影响视图外观的决策,而不影响的工作方式。决定每个屏幕显示多少项是视图逻辑;决定用户是否可以添加另一项是业务逻辑。将视图逻辑放在viewmodel中而不是视图中是完全可以的,如果它涉及冗长的表达式,那么它是可取的。

将“魔术数字”保留在绑定中的任何视图逻辑中。如果它是一个可以更改的参数(例如显示的结果周数)而不是真正的常量(例如一周中的天数),请将其设置为视图模型的属性并在视图的任何表达式中引用它