我们正在使用ember的版本pre4。
我们有一个框架(SignalR)与ember并行工作,可以处理我们应用程序的实时通知。在旧版本的ember中,我们能够访问路由器/控制器的全局引用。但随着Ember的新版本,这已不再可能。 (这可以) 我们尝试过不同的方法,比如在顶部路径中设置全局控制器:
setupController: function(){
app.appController = this.controllerFor('app');
}
并向此控制器发送一个事件,该事件冒泡到这样的路径:
notificator.update = function (context) {
app.appController.send('notificationOccured', context);
});
但这感觉就像是在与Ember团队合作,刚刚取消了全球参考资料。
现在提出一个大问题:是否有更好的方法从Ember外部访问路由器或控制器?最好使用上下文发送事件。
感谢所有帮助!
答案 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
答案 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