Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript KnockoutJS中ViewModels之间的通信_Javascript_Knockout.js_Viewmodel - Fatal编程技术网

Javascript KnockoutJS中ViewModels之间的通信

Javascript KnockoutJS中ViewModels之间的通信,javascript,knockout.js,viewmodel,Javascript,Knockout.js,Viewmodel,我试图在knockoutjs驱动的应用程序中实现视图模型之间的通信。我使用yeoman工具构建了它,正如您所看到的,它使用AMD: define(['knockout', 'signals', 'text!./nav-bar.html'], function(ko, Signal, template) { function NavBarViewModel(params) { this.route = params.route; } return { v

我试图在
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()

问题是-我应该把这个事件调度器放在哪里?很明显,它应该是某种全局对象,这样每个虚拟机都可以控制它,但这会很难看。我想到依赖注入,因为我选择的这个体系结构中的所有其他东西都是这样做的,但是如何实现呢?我来自
WPF,MVVM
world,到目前为止,我使用了MVVMLight框架,它有一个很棒的
Messenger
组件。在JS世界中有没有类似的东西(如果我已经在使用
jssignals
lib,那么我应该如何使用它来实现我的目标?)


我也可以使用knockout fw中内置的
subscribable
对象,但问题仍然存在-将其放置在何处(或如何在虚拟机之间共享实例)?

您只需将其包含在
定义中即可注入

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

然后在当前文件中添加:

define([ ... , ... , "EventDispatcher"], function( ... , ... , EventDispatcher )
现在,您只需使用以下命令调用此文件中的方法:

EventDispatcher.itemClicked.dispatch()
(其中
EventDispatcher
是我们在
define
参数中对其命名的内容)


请记住,您的
EventDispatcher.js
文件还需要通过自己的
define
包装传递给它的
signals
文件。这有点好,因为我不需要在我的任何虚拟机上包含更多的依赖项-它只是为Knockout添加了一些功能:)。但是你回答了我的问题,所以我接受你的回答。