2

DurandalJS を使用して次のアプリケーションを構築しました。

  1. Index.html : デフォルトのベースページ
  2. Shell.js : シェル - メニューが含まれています
  3. intro.js : ユーザーが認証されていない場合、ビューモデルはシェル内でレンダリングされます
  4. home.js : ユーザーが認証されている場合、ビューモデルはシェル内でレンダリングされます

私の認証コードは shell.js から呼び出されます。

intro.js および home.js ファイル内のいくつかのプロパティを監視できるシェルが必要です。具体的には、ユーザーがこれらのビューのいずれかでチェックボックスのある項目を選択した場合、メニュー項目を変更するには shell.js が必要です。理想的には、シェルがビューモデル内のものを「観察」できるようにすることで、これを行うことができます。これは可能ですか?

4

2 に答える 2

7

私は前に同じ問題を抱えていました。デュランダル イベントを使用して、シェルと他のビューの間の通信を実装しました。

次のリンクでデュランダル イベントに関する情報を見つけることができます: 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 に答える