17

emberのバージョンpre4を使用しています。

アプリケーションへのリアルタイム通知を処理する ember と並行して動作するフレームワーク (SignalR) があります。古いバージョンの ember では、ルーター/コントローラーのグローバル参照にアクセスできました。しかし、Ember の新しいバージョンでは、これはもはや不可能です。(これで問題ありません) トップ ルートにグローバル コントローラーを設定するなど、さまざまなアプローチを試しました。

setupController: function(){
    app.appController = this.controllerFor('app');
}

このコントローラーにイベントを送信すると、次のようにルートにバブルアップします。

notificator.update = function (context) { 
    app.appController.send('notificationOccured', context);
});

しかし、これは、グローバル参照を削除したばかりの Ember チームに逆らっているように感じます。

ここで大きな問題になります。Ember の外部からルーターまたはコントローラーにアクセスするためのより良い方法はありますか? できれば、コンテキストを使用していずれかにイベントを送信します。

すべての助けに感謝します!

4

2 に答える 2

36

ここで大きな問題になります。Ember の外部からルーターまたはコントローラーにアクセスするためのより良い方法はありますか? できれば、コンテキストを使用していずれかにイベントを送信します。

はい。これは、ember インストルメンテーション モジュールに適しているように思えます。適切なコントローラーで SignalR イベントをサブスクライブし、アプリがリアルタイム通知を処理するたびにそれらをトリガーします。

まず、更新を処理するためのメソッドを ApplicationController に追加します。ここで定義されていない場合、イベントはルーターにバブリングします。

App.ApplicationController = Ember.Controller.extend({
  count: 0,
  name: 'default',
  signalrNotificationOccured: function(context) {
    this.incrementProperty('count');
    this.set('name', context.name);
  }
});

次に、signalr.notificationOccuredイベントをサブスクライブして ApplicationController をセットアップします。before コールバックを使用してイベントをログに記録し、そのペイロードをコントローラーに送信します。

App.ApplicationRoute = Ember.Route.extend({
  setupController: function (controller, model) {
    Ember.Instrumentation.subscribe("signalr.notificationOccured", {
      before: function(name, timestamp, payload) {
        console.log('Recieved ', name, ' at ' + timestamp + ' with payload: ', payload);
        controller.send('signalrNotificationOccured', payload);
      },
      after: function() {}
    });
  }
});

次に、SignalR アプリケーションから、Ember.Instrumentation.instrument次のようにペイロードを ApplicationController に送信します。

notificator.update = function (context) { 
  Ember.Instrumentation.instrument("signalr.notificationOccured", context);
});

ここにシミュレートされた SignalR 通知を含む作業コピーを投稿しました: http://jsbin.com/iyexuf/1/edit

インストルメンテーション モジュールに関するドキュメントは、こちらで見つけることができます。その他の例については、仕様も確認してください。

于 2013-01-24T18:34:39.257 に答える
3

おそらくこれを行うべきではありませんが、アプリケーションのコントローラー、ビュー、モデル、およびルーター インスタンスにアクセスする方法を次に示します。アプリケーションが初期化されると、コントローラー、ビュー、モデル、およびルーターがすべてアプリケーション コンテナーに登録されます。__container__

APP.__container__.lookup('controller:foo').get('content');
APP.__container__.lookup('view:foo').get('templateName');
APP.__container__.lookup('router:main');

私がすべきことは、サードパーティのライブラリへの呼び出しを Ember 内にカプセル化し、Ember にアプリケーション全体を管理させることです。JQuery UI を ember 対応にするこの試みを参照してください

于 2013-01-23T20:32:12.123 に答える