从路由转换不会删除 Ember.js 中退出路由的控制器观察器
Transitioning from a route doesn't remove exited route's controller observers in Ember.js
这里有一个JSBin来说明我遇到的问题。
http://jsbin.com/patuje/4
我正在使用依赖注入来对 API 进行轮询机制,如下所示
App.Poller = Ember.Object.extend({
interval: function() {
return 1000;
}.property().readOnly(),
schedule: function(f) {
return Ember.run.later(this, function() {
f.apply(this);
this.set('timer', this.schedule(f));
}, this.get('interval'));
},
stop: function() {
this.set('running', false);
Ember.run.cancel(this.get('timer'));
},
start: function() {
if (!this.get('running')) {
this.set('running', true);
this.set('timer', this.schedule(this.get('onPoll')));
}
},
onPoll: function() {
Ember.Logger.log('basic poller overwrite with your method');
}
});
App.register('poller:main', App.Poller);
App.inject('route', 'poller', 'poller:main');
App.inject('controller', 'poller', 'poller:main');
这样我就可以从我的路由和控制器调用开始和停止轮询。
我设置了父路由,以便它间歇性地轮询服务器以获取父路由中的进度,如下所示(请注意,获取语法来自 Ember Data beta 12,但工作正常(
App.ParentRoute = Ember.Route.extend({
setupController: function(controller, model) {
store = this.store;
controller.set('model', model);
this.poller.reopen({
onPoll: function() {
return store.fetch('mymodel', 1);
}
});
},
model: function() {
return this.store.find('mymodel', 1);
}
});
作为步骤过程的一部分,我有各种子路由,这取决于从 API 轮询接收的数据,因此在子控制器中,我设置了一个这样的观察者
App.ParentChild1Controller = Ember.Controller.extend({
needs: ['parent'],
progress: Ember.computed.alias('controllers.parent.progress'),
pollingChild1: function() {
progress = this.get('progress');
Ember.Logger.log('called from pollingChild1 : ', progress);
if (progress < 50) {
this.poller.start();
} else {
this.transitionToRoute('parent.child2');
}
}.observes('progress').on('init')
});
它只是开始轮询,一旦进度超过 50,就会过渡到下一个路由。
我不明白的是,为什么在过渡到新路线后,这个观察者继续被称为?
如果在路由更改时从该 JSBin 查看控制台,它仍在被调用。
非常感谢为什么会发生这种情况的任何建议。
轮询器继续运行的原因是控制器是单例,这意味着控制器将在应用程序的生命周期内保留。
在您的情况下,甚至没有触及parent
控制器,因为您所做的只是过渡到parent
路线的另一个 chid。但是,即使您交换了parent
控制器的模型,轮询器仍将运行,因为它在单例控制器上运行。
您可以在此处阅读有关它的更多信息:http://balinterdi.com/2014/06/26/ember-gotcha-controllers-are-singletons.html
相关文章:
- Emberjs应用程序加载在除Index之外的所有路由上
- 正在使用$location.path(.)路由ng视图
- 在AngularJS应用程序中使用封装指令和路由的推荐方式是什么
- 弹出窗口出现,然后退出
- 退出全屏不起作用
- 基于两个条件退出While循环
- 未激发路由的控制器属性上的观察者
- AngularJS ui路由器html5模式中断路由
- 如何准确执行加载脚本&退出弹出窗口
- 发送json对象或使用express路由呈现视图
- 使用主干网和rails的静态页面路由
- 如何使用Passport保护路由终结点
- firefox插件:退出不工作的应用程序观察器
- 有没有办法用routerLink/router.navigation附加查询/路由参数
- Nodejs和express路由,如何处理客户端的承诺
- TinyMCE实例在切换角度路由选项时会消失
- 什么'在Express中路由时,应用程序级中间件和路由器级中间件之间的区别是什么
- 使用Ampersand.js路由模块化应用程序
- 无法执行文件.退出Acrobat PDF中的操作
- 从路由转换不会删除 Ember.js 中退出路由的控制器观察器