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 内的 3rd 方库的调用,让 Ember 管理整个应用程序。请参阅此尝试使 JQuery UI 可感知余烬

于 2013-01-23T20:32:12.123 回答