【问题标题】:Communication between ViewModels in KnockoutJSKnockoutJS 中 ViewModel 之间的通信
【发布时间】:2015-07-11 17:52:08
【问题描述】:

我正在尝试在knockoutjs 驱动的应用程序中实现我的视图模型之间的通信。我使用yeoman 工具搭建了它,你可以看到它使用AMD

define(['knockout', 'signals', 'text!./nav-bar.html'], function(ko, Signal, template) {

    function NavBarViewModel(params) {
        this.route = params.route;
    }

    return { viewModel: NavBarViewModel, template: template };

});

我必须定义一个对象,以便稍后用于分派事件,对吗?类似的东西:

var EventDispatcher = {
    itemClicked: new Signal()
};

然后,每当NavBarViewModel 中发生任何事情时,我都想做:

EventDispatcher.itemClicked.dispatch();

问题是 - 我应该把这个 EventDispatcher 放在哪里?很明显,它应该是某种全局对象,以便每个 VM 都可以控制它,但它会很丑陋。我想到了依赖注入,因为我选择的这个架构中的其他所有东西都是以这种方式完成的,但是如何实现呢?我来自WPF, MVVM 世界,到目前为止,我使用了 MVVMLight 框架,它有这个很棒的Messenger 组件。在 JS 世界中是否有类似的东西(如果它是我已经在使用的 js-signals lib,那么我应该如何使用它来实现我的目标?)

我也可以使用内置于淘汰赛固件中的subscribable 对象,但问题仍然存在 - 将它放在哪里(或如何在 VM 之间共享实例)?

【问题讨论】:

    标签: javascript knockout.js viewmodel


    【解决方案1】:

    您只需将其包含在您的define 中即可注入它。

    首先,创建一个新文件,EventDispatcher.js,其中包含您的 EventDispatcher 代码(以及其他相关的 Knockout 位,例如返回视图模型等)。

    然后在你当前的文件中添加:

    define([ ... , ... , "EventDispatcher"], function( ... , ... , EventDispatcher )
    

    现在您可以使用以下方法在此文件中简单地调用其方法:

    EventDispatcher.itemClicked.dispatch()
    

    (其中EventDispatcher 是我们在define 参数中命名的)。

    请记住,尽管您的 EventDispatcher.js 文件还需要通过其自己的 define 包装器传递给它的 signals 文件。

    【讨论】:

    • 在您发布此答案前一秒,我发现了这一点:github.com/rniemeyer/knockout-postbox。哪个更好,因为我不需要在我的任何 VM 上包含更多依赖项 - 它只是为 Knockout 添加了一些功能:)。但是你回答了我问的确切问题,所以我接受你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-29
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多