2

我有一个使用 DurandalJS 构建的应用程序,其中包含以下内容:

  1. Index.html : 默认基页
  2. Shell.js:外壳 - 包含一个菜单
  3. intro.js:如果用户未通过身份验证,则在 shell 中呈现视图模型
  4. home.js:如果用户通过身份验证,则在 shell 中呈现视图模型

我的身份验证代码是从 shell.js 调用的。

我需要我的 shell 能够监控 intro.js 和 home.js 文件中的一些属性。具体来说 - 如果用户在其中一个视图中选择带有复选框的项目,我需要 shell.js 来更改菜单项。理想情况下,这可以通过允许外壳“观察”视图模型中的内容来完成。这可能吗?

4

2 回答 2

7

我前段时间也有同样的问题。我使用 Durandal 事件来实现 shell 和其他视图之间的通信。

您可以在下一个链接中找到有关 Durandal 事件的信息:http: //durandaljs.com/documentation/Events/

我给你举个例子,因为文档不是很清楚。

要在 durandal 中引发事件,您必须使用 app 模块:

app.trigger("someEvent");

要捕获此事件,您必须这样做:

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

此外,这种通信可以实现将信息存储在本地存储或类似的东西中,但我认为使用事件更清楚。

如果有人可以为这个问题提供任何其他解决方案,那就太好了。

于 2013-04-30T06:22:40.790 回答
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);
于 2013-04-30T17:50:44.637 回答