8

デュランダルには、シェルと呼ばれるベース ビューがあります。

管理者/品質保証ユーザーが任意のシステム ユーザーを模倣できるように、検索ボックスを追加しました。ボタンをクリックすると、現在表示されているビューのビューを更新できるようにしたいと考えています。

  • Shell (Blue) View (Red)

子ビューで関数を公開して、シェルから呼び出すか、子ビューからシェルのボタンクリックイベントにフックするにはどうすればよいですか。

質問:

Durandal は、さまざまなビューまたは親コンテナーにイベントをバブリングまたは渡すために使用できるフックを公開していますか?

4

1 に答える 1

11

複数の子ビューがあり、シェルと子の間に依存関係を導入したくないと仮定すると、これにはおそらくデュランダルのイベント システムを使用するのが最善です。シェル ビューがパブリッシャーになり、子ビューがサブスクライバーになります。

動作するデモについては、http://dfiddle.github.io/dFiddle-1.2/#/event-aggregator/dFiddleをご覧ください。

publisher.js

define(['durandal/app'], function (app) {

    var message = ko.observable();
    var canPublish = ko.computed(function () {
        return message() ? true : false;
    });

    return {
        message: message,
        canPublish:canPublish,
        publish: function () {
            app.trigger('sample:event', message());
        }
    };
});

サブスクライバー.js

define(['durandal/app'], function (app) {

    return {
        received: ko.observableArray([]),
        subscription:ko.observable(),
        subscribe: function () {
            var sub = app.on('sample:event').then(function(message) {
                this.received.push(message);
            }, this);

            this.subscription(sub);
        },
        unsubscribe: function () {
            this.subscription().off();
            this.subscription(null);
        }
    };
});

考えられるその他のオプション

  • 親/子間で共有する必要があるプロパティを持つシングルトンを返す共有モジュール。欠点は、すべての親/子で依存関係として定義する必要があります。
  • 1 つのグローバル、たとえばプロパティを持つ myApp... 欠点: グローバルを公開する
于 2013-07-22T08:35:45.147 に答える