通过didInsertElement视图函数进行Layouting的时序问题

时间:2013-11-29 19:29:02

标签: ember.js

我遇到了丑陋的计时问题(竞争条件),并且在didInsertElement()中使用jQuery执行基于高度计算的布局。 例如,我通过$('header.someClass').outerHeight(true);计算标题的高度,然后我使用结果从顶部偏移内容区域。如果我通过重新加载整个页面来全新渲染视图(它在我的示例中为60px),但是如果我从另一个视图导航到视图,则会因为返回错误的高度而失败(在我的示例中为6px)。 要证明这是一个时间问题:如果我将代码包装在: Em.run.later(function() { ...do layout }, 50); 有用。 我认为这是一个严重的问题,因为Ember中没有其他钩子,我可以附加。

2 个答案:

答案 0 :(得分:1)

相反,您应该安排jQuery逻辑在渲染后运行:

App.YourView = Ember.View.extend({
  didInsertElement : function(){
    this._super();
    Ember.run.scheduleOnce('afterRender', this, function(){
        // perform your jQuery logic here
    });
  }
});

在我的blog中找到更多信息和解释。

答案 1 :(得分:0)

听起来你可能会对ember的工作方式有一点误解。

将特定视图注入dom时触发didInsertElement,而不是当所有元素都在dom中时。注意:如果它后面的模型发生变化,ember将不会再次触发didInsertElement,因为它没有重新插入到dom中。

如果延迟时它起作用,那么听起来你计算某物的大小的逻辑取决于那些可能不存在的东西。

使用emberjs.jsbin.com随时展示它的一个例子。