在Ember.js中完全呈现所有视图后执行一次代码

clu*_*ess 8 ember.js

像文件准备好的东西,但毕竟Ember视图渲染

我正在使用ApplicationView didInsertElement上的覆盖来执行此操作,这似乎到目前为止工作:

App.ApplicationView = Em.View.extend({
  didInsertElement: function() {
    // Do your magic.
  }
});
Run Code Online (Sandbox Code Playgroud)

我想知道这是否是准备好Ember文档的正确方法,或者如果Ember对这个简单而非常常见的东西有更多原生支持.

小智 10

您可以通过重新打开基本View类并将其添加到渲染队列中来轻松添加"post render"挂钩.

这里有一些代码向您展示如何:

Ember.View.reopen({
    didInsertElement : function() {
        this._super();
        Ember.run.scheduleOnce('afterRender', this, this.didRenderElement);
    },
    didRenderElement : function() {
        // Override this in your View's
    }
});
Run Code Online (Sandbox Code Playgroud)


int*_*xel 5

didInsertElement是正确的地方,但如果你想完全确定你的渲染队列是完全刷新的,你也可以听这个afterRender事件,如下所示:

App.ApplicationView = Ember.View.extend({
  didInsertElement: function() {
    Ember.run.scheduleOnce('afterRender', this, 'processChildElements');
  },

  processChildElements: function() {
    // do here what you want with the DOM
  }
});
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

  • 实际上,ApplicationView似乎不是正确的位置,它适用于第一个请求,但是当你开始渲染其他模板之后,钩子不会触发.我在渲染后想要执行代码的特定视图上定义了didInsertElement,并且工作正常,但如果Ember在每次转换后都有渲染所有视图的通用挂钩,那就太好了. (3认同)