如何从另一个框架向Ember发起一个事件

时间:2013-01-22 12:12:44

标签: ember.js

我们正在使用ember的版本pre4。

我们有一个框架(SignalR)与ember并行工作,可以处理我们应用程序的实时通知。在旧版本的ember中,我们能够访问路由器/控制器的全局引用。但随着Ember的新版本,这已不再可能。 (这可以) 我们尝试过不同的方法,比如在顶部路径中设置全局控制器:

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

并向此控制器发送一个事件,该事件冒泡到这样的路径:

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

但这感觉就像是在与Ember团队合作,刚刚取消了全球参考资料。

现在提出一个大问题:是否有更好的方法从Ember外部访问路由器或控制器?最好使用上下文发送事件。

感谢所有帮助!

2 个答案:

答案 0 :(得分:36)

  

现在提出一个大问题:是否有更好的方法从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

可以找到有关检测模块的文档here,另请查看specs以获取更多示例。

答案 1 :(得分:3)

您可能不应该这样做,但这是一种访问应用程序的控制器,视图,模型和路由器实例的方法。初始化应用程序时,控制器,视图,模型和路由器都在应用程序容器中注册__container__

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

我认为你应该做的是将调用封装到Ember内的第三方库,让Ember管理整个应用程序。请参阅this attempt以了解JQuery UI ember-aware