ここで大きな問題になります。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
インストルメンテーション モジュールに関するドキュメントは、こちらで見つけることができます。その他の例については、仕様も確認してください。