Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Ember.js中的方法之间共享变量上下文_Javascript_Model View Controller_Ember.js - Fatal编程技术网

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项。