2013-04-30 45 views
2

我已經建立了DurandalJS具有以下應用:應用架構迪朗達爾

  1. 的Index.html:缺省的基頁
  2. Shell.js:外殼 - 包含菜單
  3. intro.js:視圖模型在外殼內再現,如果用戶沒有通過認證
  4. home.js:如果用戶已通過身份驗證,視圖模型將在shell中呈現

我的身份驗證代碼是從shell.js調用的。

我需要我的shell能夠監視intro.js和home.js文件中的一些屬性。特別是 - 如果用戶在其中一個視圖中選擇了一個複選框,我需要shell.js來更改菜單項。理想情況下,這可以通過讓she​​ll在視圖模型中「觀察」東西來完成。這可能嗎?

回答

6

我以前有過同樣的問題。我用Durandal事件來實現shell和其他視圖之間的通信。

您可以找到有關下一環節迪朗達爾事件的信息:http://durandaljs.com/documentation/Events/

我guive你一個例子,因爲文件是不是很清楚。

拋出一個事件迪朗達爾您必須使用應用模塊:

app.trigger("someEvent"); 

爲了趕上這種情況下,你要做的是:

app.on("someEvent", function() { 
    //Do that you want 
}); 

而且,這種交際可以實現將信息存儲在本地存儲或類似的東西,但我認爲使用事件更清晰。

如果有人可以給這個問題提供任何其他解決方案,那就太好了。

+0

謝謝。任何關於淘汰賽的pub/sub的想法? http://www.knockmeout.net/2012/05/using-ko-native-pubsub.html – SB2055 2013-04-30 13:56:17

+0

我剛剛看過你的鏈接,我覺得這也很有意思,我會在看後更加深入。但我認爲durandal事件模塊更易於使用,如果您使用的是durandal,則應該使用該模塊。感謝您的鏈接。 – jvrdelafuente 2013-04-30 17:17:34

1

我結束了使用從這裏的pub/sub: knockmeout.net/2012/05/using-ko-native-pubsub.html

我的小提琴: http://jsfiddle.net/PTSkR/38/

/* Pub/sub code */ 
var postbox = new ko.subscribable(); 

ko.subscribable.fn.publishOn = function(topic) { 
    this.subscribe(function(newValue) { 
     postbox.notifySubscribers(newValue, topic); 
    }); 

    return this; //support chaining 
}; 

ko.subscribable.fn.subscribeTo = function(topic) { 
    postbox.subscribe(this, null, topic); 

    return this; //support chaining 
}; 

/* Selection code */ 
this.selectedItems = ko.observableArray().subscribeTo("TOPIC"); 

var viewModel = { 
    documents: [{"documentId": "1"}, {"documentId": "2"}, {"documentId": "3"}], 
    selectedDocumentIds: ko.observableArray() 
}; 

viewModel.documentIndex = {}; 
ko.utils.arrayForEach(viewModel.documents, function(doc) { 
    viewModel.documentIndex[doc.documentId] = doc; 
}); 

this.selectedDocuments = ko.computed(function() { 
    return ko.utils.arrayMap(viewModel.selectedDocumentIds(), function(id) { 
     return viewModel.documentIndex[id]; 
    }); 
}).publishOn("TOPIC"); 

ko.applyBindings(viewModel);