Javascript 在Ember.js中的方法之间共享变量上下文
我正在构建一个对象,该对象处理一个计时方法,以控制使用来自服务器的数据刷新模型。非常简单。然而,我对余烬还不熟悉,很难理解范围和上下文 例如,当我创建这样的对象时:Javascript 在Ember.js中的方法之间共享变量上下文,javascript,model-view-controller,ember.js,Javascript,Model View Controller,Ember.js,我正在构建一个对象,该对象处理一个计时方法,以控制使用来自服务器的数据刷新模型。非常简单。然而,我对余烬还不熟悉,很难理解范围和上下文 例如,当我创建这样的对象时: App.ModelRefresh = Ember.Object.extend({ start: function(){ this.timer = setInterval(this.refresh.bind(this), 2000); }, stop: function(){ console.log('st
App.ModelRefresh = Ember.Object.extend({
start: function(){
this.timer = setInterval(this.refresh.bind(this), 2000);
},
stop: function(){
console.log('stop');
clearInterval(this.timer);
},
refresh: function(){
console.log('refresh');
}
});
然后在路由器中创建它来处理重新加载。同样如此:
App.PublishablesRoute = Ember.Route.extend({
model: function() {
return App.Publishable.fetch();
},
setupController: function(controller, model) {
controller.set('model', model);
var modelRefresh = App.ModelRefresh.create();
modelRefresh.start();
},
deactivate: function() {
modelRefresh.stop();
}
});
在控制台中,我看到了错误
断言失败:加载路由时出错:引用错误:未定义modelRefresh
我可以让它运行方法.start()
(显然)而不费吹灰之力。但是我可以运行.stop()
。这是有道理的,但是如何在不同的路由方法之间共享新创建的modelRefresh呢。在Backbone.js中,我将添加它来初始化并使用this
引用父级。在余烬中,这似乎不起作用
任何帮助都将不胜感激
App.PublishablesRoute = Ember.Route.extend({
model: function() {
return App.Publishable.fetch();
},
setupController: function(controller, model) {
controller.set('model', model);
var modelRefresh = App.ModelRefresh.create();
modelRefresh.start();
this.set('modelRefresh', modelRefresh );
},
deactivate: function() {
var modelRefresh = this.get('modelRefresh');
modelRefresh.stop();
}
});
路由器激活和停用
目前,每当Ember激活或停用路由处理程序时,许多人都在使用未记录和私有的进出挂钩来运行代码
从Ember 1.0 RC1开始,有两个公共挂钩:激活和停用。请注意,只有在第一次激活路由处理程序时,激活挂钩才会运行。如果路由处理程序的上下文发生更改,setupController钩子将再次运行,但不会激活钩子
App.PublishablesRoute = Ember.Route.extend({
model: function() {
return App.Publishable.fetch();
},
activate: function() {
$('#page-title').text("Publish");
var modelRefresh = App.ModelRefresh.create();
this.set('modelRefresh', modelRefresh );
modelRefresh.start();
},
deactivate: function() {
var modelRefresh = this.get('modelRefresh');
modelRefresh.stop();
}
});
关于init
init: function() {
var modelRefresh = App.ModelRefresh.create();
this.set('modelRefresh', modelRefresh );
this._super();
},
这绝对奏效了。我注意到,如果我将
modelRefresh.start()
单独移动到activate
和get
中,我会得到相同的断言失败错误。我是否应该知道激活会导致这种情况发生?n/m激活发生在setupController之前,因此它可能尚未创建。:)啊,好的,在init
中实例化modelRefresh
似乎已经解决了这个错误。如果您重写init,您将需要调用super,以允许余烬仍然执行通常的init项。