javascript - ui javascript 属于 MVVM 模型中的哪个位置(带 knockout )?

标签 javascript mvvm knockout.js

假设您开始使用一个通过 jquery 实现 UI 效果的网站。例如菜单。单击 anchor 将对其应用一个类,以显示该 anchor 是事件 anchor 。这是在 dom 准备好的 jquery 中完成的 -

$(function() {
  $("#menu a").click(function(){
           $("#menu a").removeClass('active');   
           $(this).addClass('active');
      });
});

现在,假设这个菜单是通过 knockout 绑定(bind)动态生成的 -

$(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 模式执行此操作的正确方法是什么?或者说 knockout 的正确方法是什么?通过viewmodel似乎是最干净的,但是它停在哪里呢?您是否有 JavaScript 使其成为 ViewModel 中鼠标悬停时的下拉菜单?

最佳答案

我将向菜单项添加一个 isSelected 可观察对象,然后在单击菜单项时切换该可观察对象(使用单击绑定(bind))。然后您可以在 View 中使用 css 绑定(bind),该 View 将使用 isSelected。

正如你所看到的,当你使用knockout时,最好只与 View 模型交互,而不是像使用jQuery时那样与dom交互。

var ViewModel = function () {
    var self = this;

    self.menuItems = [
        new MenuItem('Text1'),
        new MenuItem('Text2'),
        new MenuItem('Text3'),
        new MenuItem('Text4')
    ];

    self.toggleMenuItem = function (menuItem) {
        for (var i = 0; i < self.menuItems.length; i++) {
            self.menuItems[i].isSelected(false);
        }
        menuItem.isSelected(true);
    };
};

var MenuItem = function (menuText) {
    var self = this;

    self.menuText = menuText;
    self.isSelected = ko.observable(false);
};

<ul id="menu" data-bind="foreach: menuItems">
    <li>
        <a data-bind="text: menuText, click: $parent.toggleMenuItem, css: { active: isSelected }"></a>
    </li>
</ul>

http://jsfiddle.net/d625vaad/1/

关于javascript - ui javascript 属于 MVVM 模型中的哪个位置(带 knockout )?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27431618/

相关文章:

Javascript 在模态窗口关闭时停止 HTML5 视频播放

c# - MvvmCross Windows Store 如何将不同的 ViewModel 绑定(bind)到 Appbar?

javascript - 何时将扩展附加复杂类型添加到 Breeze 实体上

javascript - 在 KnockoutJS 中使用 bool 值显示隐藏 div 并应用 css 规则

javascript - 将资源文件中的值与 KO 可观察值连接起来

javascript - for ... of 和 while(true) 内部循环的替代方案

javascript - 如何检测哪些复选框被选中?

mvvm - 剑道用户界面 : How to set the value of a tooltip with a MVVM binding

c# - 从 ContentControl 中使用的 Ioc 的 viewModel 中释放内存

javascript - 加载图片到div,涉及到PHP和jQuery