3

shell.jsの には、API エンドポイント (チケットのリスト) からデータを収集するために呼び出すことができるアクションがあります。このデータを取得したらrouter.navigateTo("purchase"),、有効なルートです。

このデータを viewModel に渡す必要があります。DurandalJS でこれを行うための標準的なアプローチはありますか、またはある種の pub/sub メカニズムを調べる必要がありますか?

(今のところ実装した) 1 つの解決策は、単に window -in を使用することですshell.js。データ サービスの呼び出しが完了したら、次のように言いwindow.tickets = dataFromService. ますwindow.tickets。これは汚い感じで、デュランダルで適切な解決策がどのように見えるかに興味があります.

4

2 に答える 2

3

Durandal の哲学では、シェルがデータを取得するべきではありません。代わりに、購入した vm はそのactivateコールバック ( http://durandaljs.com/documentation/Creating-A-Module/ ) でそれを行う必要があります。activateif ticket collection is a asyncoperationから promise を返すようにしてください。

そのパターンの例を次に示します。ここでgetListCollectionは、キャッシュされた結果 (同期) または非同期の結果を返すことができるため、常にプロモースを返す $.when() でラップされます。

http://www.spirit.de/demos/metro/durandalsp3/index.html#/lists

var activate = function () {
    var self = this;
    var webUrl = L_Menu_BaseUrl;

    self.webUrl(webUrl);

    logger.log('Activatíng List View', null, 'list', true);

    return $.when(spdata.getListCollection({ webUrl: webUrl })).then(function (result) {

        // Access to detail list information through listInfo[listName]
        self.listInfo = result;
        self.lists(createListVMs(result));

        return true;
    });
};

コメントに基づいて更新: 決定を下すためにシェルでデータを取得する必要がある場合は、いくつかのオプションがあります。

  • Durandal 1.2 ではウィジェットのみが追加のデータを渡すことができるため、購入した vm をウィジェットに変換することを検討してください。
  • global別の方法として、シングルトンを返し、シェルと購入の間で共有される AMD を 作成します。
  • 3 番目のオプションは、購入をシェルで依存関係として宣言し、購入を直接変更することです。

詳細については、@Joseph Gabriel を参照してください。DurandalJSのデータを他のビューに渡します

于 2013-06-10T07:13:35.923 に答える
2

カスタム イベント (pub/sub スタイル) を使用して、viewModel 間で任意のデータを渡すこともできます。

app.trigger('my:custom:event', message);

app.on('my:custom:event').then(function(message){
    //do something with the payload
});

詳細については、ドキュメントを参照してください。

于 2013-09-12T22:06:19.523 に答える