2013-12-13 46 views
0

我正在构建一个对象,该对象处理定时方法以控制使用来自服务器的数据刷新模型。这非常简单。但是,我是Ember的新手,难以理解范围和背景。在Ember.js中的方法之间共享变量上下文

举例来说,当我创建一个对象,例如:

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(); 
    } 
}); 

在控制台中,我看到错误。

Assertion failed: Error while loading route: ReferenceError: modelRefresh is not defined

我可以得到它没有麻烦(显然)运行的方法.start()。但我可以运行.stop()。这是有道理的,但如何在不同的路由方法之间共享新创建的modelRefresh。在Backbone.js中,我会添加它来初始化并使用this引用父项。在Ember中,这似乎不起作用。

任何帮助,将不胜感激。

回答

1
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 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: function() { 
    var modelRefresh = App.ModelRefresh.create(); 
    this.set('modelRefresh', modelRefresh); 
    this._super(); 
}, 
+0

这是绝对奏效。我注意到,如果我将'modelRefresh.start()'移动到''''激活''我得到相同的断言失败错误。有什么我应该知道的激活会导致这种情况发生? –

+0

你能告诉我吗? – Kingpin2k

+0

n/m激活发生在setupController之前,所以它可能还没有被创建。 :) – Kingpin2k