2015-05-01 55 views
2

我試圖在knockoutjs驅動的應用程序中實現我的視圖模型之間的通信。我腳手架它使用yeoman工具,你可以看到它使用AMDViewModels在KnockoutJS中的通信

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世界,到目前爲止,我已經使用了MVVMLight框架,它具有這個偉大的Messenger組件。在JS世界裏有沒有類似的東西(如果我已經使用了js-signals lib,那麼我應該如何使用它來實現我的目標?)

我也可以使用subscribable內置到knockout fw中的對象,但問題仍然存在 - 放在哪裏(或如何在虛擬機之間共享實例)?

回答

1

您只需將它包含在您的define中即可。

首先,創建一個新的文件,EventDispatcher.jsEventDispatcher代碼中(以及其他相關的淘汰賽位,好像回到視圖模型和諸如此類的東西)。

然後在當前文件添加進來:

EventDispatcher.itemClicked.dispatch() 

(其中EventDispatcher就是我們將其命名爲:

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

現在,你可以簡單地通過調用它的這個文件中的方法在我們的define參數中)。

請記住,您的EventDispatcher.js文件還需要通過其自己的define包裝傳遞給它的signals文件。

+0

在您發佈此答案之前,我發現了這一點:https://github.com/rniemeyer/knockout-postbox。哪個更好一些,因爲我不需要在我的任何虛擬機上包含更多的依賴關係 - 它只是增加了一些功能給Knockout :)。然而,你回答我問的確切問題,所以我接受你的答案。 –