当Ember.js完成加载所有内容时,有没有办法获得回调?

时间:2012-04-30 14:44:41

标签: ember.js

我正在构建一个Ember.js应用程序,我需要在渲染/加载所有内容后进行一些额外的设置。

有没有办法获得这样的回调?谢谢!

5 个答案:

答案 0 :(得分:10)

在Views上定义了几个可以重载的函数,这些函数将被自动调用。其中包括willInsertElement()didInsertElement()afterRender()

特别是我发现didInsertElement()是运行代码的有用时间,这些代码在常规的面向对象系统中将在构造函数中运行。

答案 1 :(得分:6)

您可以使用ready的{​​{1}}属性。

来自http://awardwinningfjords.com/2011/12/27/emberjs-collections.html的例子:

Ember.Application

答案 2 :(得分:5)

LazyBoy的回答是你想要做的,但它的工作方式与你想象的不同。你的问题的措辞突出了关于恩伯的一个有趣的观点。

在您的问题中,您指定在呈现视图后需要回调。但是,对于良好的'Ember'样式,你应该使用初始化应用程序后触发的'ready'回调,但之前呈现视图。

重要的概念点是,在回调更新数据模型后,您应该让Ember更新视图。

让ember更新视图大多是直截了当的。有一些边缘情况需要使用'didFoo'回调来避免视图中的状态转换闪烁。 (例如,避免显示“没有找到物品”0.2秒。)

如果这对你不起作用,你也可以调查'onLoad'回调。

答案 3 :(得分:3)

您可以使用jQuery ajax callbacks

$(document).ajaxStart(function(){ console.log("ajax started")})
$(document).ajaxStop(function(){ console.log("ajax stopped")})

这适用于所有ajax请求。

答案 4 :(得分:1)

我只是将其放入应用程序路径

actions: {
    loading: function(transition, route) {

        this.controllerFor('application').set('isLoading', true);

        this.router.on('didTransition', this, function(){
          this.controllerFor('application').set('isLoading', false);
        });
    }
}

然后我的模板中的任何地方都可以使用{{#if isLoading}}启用和禁用加载内容,或者我可以在实际加载操作中添加特殊的jQuery事件。

非常简单但有效。