2013-07-22 6 views
8

Durandalには、shellという基本ビューがあります。Durandal/Knockout。他のビュー/ビューモデルを更新する

管理者/品質保証ユーザーがシステムユーザーを模倣できるように、検索ボックスを追加しました。 ボタンをクリックすると、現在表示されているビューのビューを更新できます。私からそれを呼び出すことができるように私は私の子ビュー上の機能を露出させ、に行くかどう

  • シェル(ブルー) ビュー(レッド)

シェル、または子ビューからのシェルのボタンクリックイベントへのフック。

質問:

デュランダルは、私は、バブルへの利用したり、異なるビューまたは親コンテナにイベントを渡すことができます任意のフックを公開していますか?

答えて

11

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

デモ用の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()); 
     } 
    }; 
}); 

subscriber.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); 
     } 
    }; 
}); 

  • その特性を有するシングルトンを返す共有モジュール考えられる

    その他のオプションすべきである親子間で共有されます。欠点はすべての親子の依存関係として定義する必要があります。

  • プロパティを持つmyApp ...欠点:グローバル公開
+1

これはすごくクールな解決策です。 :)すべての助けをもう一度Rainerに感謝します。 –

関連する問題