2

是否有任何可用的调整来使 Knockout 支持路由事件?

在我的特殊情况下,我想在我的视图的根虚拟机中处理上下文菜单事件,并让任何嵌套的虚拟机设置一个上下文菜单触发器,如下所示:

event: { contextmenu: OnContextMenu }

如果OnContextMenu-handler 没有在当前 vm 上定义,它应该将事件路由到它的 parent-vm,依此类推,直到找到处理程序。

目前我必须这样做(这很容易出错)

event: { contextmenu: $parents[3].OnContextMenu }

还是有其他方法可以做到这一点?

4

2 回答 2

0

我以前使用过一种模式,我通过 $parentContext 搜索视图模型的层次结构,直到找到我需要的任何东西。我很快将它改编为您的代码,有点粗糙:

OnContextMenuSearch = function(data, event) {
    var context = ko.contextFor(event.target);
    done = false;

    while (!done) {
        if (typeof context.$data.OnContextMenu == "function") {
            // Found it! Invoke it here...
            context.$data.OnContextMenu()
            done = true;
        }
        // Check there is something to recurse up into, before assigning it! 
        // If not, we are at the $root. 
        if ('$parentContext' in context == false) done = true;
        else context = context.$parentContext;
    }
}

这将与以下内容绑定:

event: { contextmenu: OnContextMenuSearch }
于 2014-08-11T15:05:19.783 回答
0

找到了一个简单的解决方案。我正在使用内置的 DOM 事件冒泡,然后在根元素上捕获事件并使用 ko.dataFor 获取 vm,如下所示:

self.OnContextMenu = function (vm, e) { // the root-vm
  vm = ko.dataFor(e.originalEvent.target);
  if (vm && vm.contextMenu) {
    self.openContextMenu(vm.contextMenu);
  }
};
于 2014-08-11T15:58:10.977 回答