2013-10-07 48 views
1

我有一个模板的标准Ember视图。dmber中的Ember事件渲染属性

模板:

<script type="text/html" data-template-name="template"> 
    <div id="container"> 
    <p>{{{view.description}}}</p> 
    </div> 
</script> 

查看:

Em.View.extend({ 
    templateName: 'OutlookSnapshotInformationTemplate', 
    description : "Loooooong text...", 
    descriptionChanged : function(){ 
    $('container').height() 
    [...] 
    }.observes('description') 
}), 

我想容器 div的尺寸,使用JQuery使用descriptionChanged观察者。

问题是描述值是异步的,并在页面呈现之前更新。

在DOM中重新呈现模板中的特定属性时会引发一个事件吗?

回答

1

在观察者的内部,与Ember.run.scheduleOnce()的调用内部的DOM交互。

http://emberjs.com/api/classes/Ember.run.html#method_scheduleOnce

这确保了给定的代码运行的渲染队列被刷新后,并进一步指出,如果你碰巧在当前运行的循环更新说明多次,它将只运行一次:

Ember.run.scheduleOnce('afterRender', this, function() { 
    var height = this.$('#container').height(); 
    // ... 
    // profit! 
}); 
+0

完美地工作! – RedBass

0

使用您的视图的didInsertElement方法:

App.YourView = Em.View.extend({ 
    templateName: 'OutlookSnapshotInformationTemplate', 
    description : "Loooooong text...", 
    didInsertElement: function() { 
    this.set('containerHeight', this.$('#container').height()); 
    console.log(this.get('containerHeight')); 
    } 
}), 
+0

是的,我知道* didInsertElement *,但在视图的lifeCycle中只调用一次,并且在可视化过程中描述可能会改变很少的时间。 – RedBass

+0

是的,但你仍然可以保持你的观察者。这个想法是在'didInsertElement'中设置视图的'containerHeight'属性,以便观察者可以访问它。 – chopper

+0

但问题在于,视图呈现时或模型中的“说明”更改时,高度可能不正确。 只有当它在DOM中发生变化时才是正确的 – RedBass