2012-06-01 15 views
16

我一直在浏览Ember文档,并且在覆盖init时发现调用_super方法时出现不一致。Ember.js在哪里调用this._super()

这是最常见的,是我一直使用的是什么,到目前为止

var Foo = Em.Object.extend({ 
    init: function(){ 
     this._super(); 
     // ... my stuff ... 
    } 
}); 

昨晚我是通过阅读this write up看到一个例子做这个

var Bar = Em.Object.extend({ 
    init: function(){ 
     // ... my stuff ... 
     return this._super(); 
    } 
}); 

它实际上是一个代码片段中的Ember.ContainerView

任何人都可以解释这一点吗?我的代码强迫症表现出色,直到我知道后我才能继续前进。

回答

13

在文档链接

init: function() { 
    var childViews = this.get('childViews'); 
    var descriptionView = App.DescriptionView.create(); 
    childViews.pushObject(descriptionView); 
    this.addButton(); 
    return this._super(); 
    }, 

_super()之后创建并被推到childViews阵列descriptionView被调用。

这是因为超类init实现将采取childViews数组,并做它的东西。如果您添加descriptionView到阵列之前称为_super,它不会得到以任何init做处理....

我推断,但是这是它在SproutCore的方式,从灰烬派生,所以我认为它可能是一样的。

+0

是的,初始化'childView'数组后调用'super'的'init'将消除必须渲染两次的开销。 –