【发布时间】:2015-02-10 10:54:20
【问题描述】:
假设您从一个通过 jquery 完成 UI 影响的网站开始。例如,菜单。单击锚点会应用一个类来显示锚点是活动锚点。这是在 dom 就绪的 jquery 中完成的 -
$(function() {
$("#menu a").click(function(){
$("#menu a").removeClass('active');
$(this).addClass('active');
});
});
现在,假设这个菜单是通过敲除绑定动态生成的 -
$(function() {
$("#menu a").click(function(){
$("#menu a").removeClass('active');
$(this).addClass('active');
});
ko.applyBindings();
});
<ul id="menu" data-bind="foreach: menuItem">
<li>
<a data-bind="text: menuText"></a>
</li>
</ul>
click 事件不会附加到这些项目上,因为 ko.applyBindings 发生在 dom 就绪时。我知道有像 afterRender 这样的事件可以用来解决这个问题,但使用 ViewModel 似乎更干净 -
<ul data-bind="foreach: menuItem">
<li>
<a data-bind="text: menuText,
click:setActive, css: {active: someComputed }"></a>
</li>
</ul>
使用 MVVM 模式执行此操作的正确方法是什么?或者用淘汰赛做这件事的正确方法是什么?通过视图模型似乎是最干净的,但它在哪里停止?您是否有 javascript 使其成为 ViewModel 中鼠标悬停时的下拉菜单?
【问题讨论】:
-
使用委托:$("#menu").on("click", "a", fn)。或将脚本块移动到模板中,以便它们一起更新。
-
我建议您阅读淘汰赛文档(我知道这不是什么)。我还建议使用敲除事件侦听器,因为它们实现得非常好,您不必担心在它们失去参考后处理东西 - 敲除会为您做到这一点
-
好问题,因为您有两种技术发生冲突。两者都有能力,而且它们本身都没有违反 MVVM 概念。问题是您想通过数据还是通过 JQUERY UI 控制视图状态?也许您目前在站点中有很多 JQUERY UI,在这种情况下,最好坚持使用它。如果它是一个新站点,那么当您转向真正的数据绑定技术时,也许 KO 更可取! KO功亏一篑;然而,在动画中,JQuery UI 更好。 (海事组织)
标签: javascript mvvm knockout.js