2013-04-27 87 views
2

我對混合組件中兒童生命週期各個方面的調用感到困惑。我沒有看到一個組件如何用於其他組件,而其他組件可能會用於其他組件。不幸的是,Michael Bolins-'關閉權威指南'沒有給出任何示例。在閉幕演示或互聯網上我都找不到任何這樣的例子。兒童組件的生命週期

這裏是我的組件有孩子:

goog.provide('MainToolbar'); 

goog.require('goog.ui.Button'); 
goog.require('goog.ui.Container'); 
goog.require('goog.ui.FlatButtonRenderer'); 

MainToolbar = function(){ 
    goog.ui.Container.call(this, goog.ui.Container.Orientation.HORIZONTAL);  
}; 
goog.inherits(MainToolbar, goog.ui.Container); 

MainToolbar.prototype.createDom = function(){ 
    var this_ = this; 
    // Pre-render the container, just to do something different. 
    //hc.render(goog.dom.getElement('main-buttons')); 
    goog.array.forEach(
     ['Happy', 'Sleepy', 'Doc', 'Bashful', 'Sneezy', 'Grumpy', 'Dopey'], 
     function(item) { 
      var c = new goog.ui.Button(item, 
       goog.ui.FlatButtonRenderer.getInstance());   
      c.addClassName('goog-inline-block'); 
      c.setId(item);   
      this_.addChild(c, true); 
     }); 
}; 

這是我如何稱呼它:

mainToolbar = new MainToolbar(); 
mainToolbar.render(goog.dom.getElement('main-buttons')); 

的問題是,MainToolbar.prototype.createDom自稱是第二次,我也得到

Uncaught Error: The object already contains the key "Happy" from myApp 

可能addChild應該放在其他地方,但到哪裏?構造函數? enterDocument?它應該如何擴展?

更新:這裏是調用堆棧顯示了第二個電話:

MainToolbar.createDom (MainToolbar.js:70) 
goog.ui.Component.addChildAt (component.js:1009) 
goog.ui.Component.addChild (component.js:913) 
(anonymous function) (MainToolbar.js:81) 
goog.array.forEach.goog.NATIVE_ARRAY_PROTOTYPES.goog.array.ARRAY_PROTOTYPE_.forEach.l (array.js:179) 
MainToolbar.createDom (MainToolbar.js:70) 
goog.ui.Component.render_ (component.js:664) 
goog.ui.Component.render (component.js:621) 
+0

「問題是MainToolbar.prototype.createDom自稱第二次」 - 第二次發生什麼時候? – ne8il 2013-04-29 12:54:39

+0

@ ne8il,我已經添加了callstack,請參閱UPDATE。 – alehro 2013-04-29 16:28:45

回答

2

goog.ui.Component的addChildAt方法(通過繼承goog.ui.Container)的檢查,以確保如果你想爲了呈現孩子的控制權,父母也必須呈現。它通過檢查「this.element_」的存在:(在我component.js的副本線1023)

if (!this.element_) { 
    this.createDom(); 
} 

這是它變得重複。當你重寫createDom方法,你需要手動創建這個屬性:

this.element_ = goog.dom.createDom('div'); 

或只是讓繼承類做的工作:

goog.base(this, 'createDom'); 

一般在方法的頂部任何工作前,已經完成了。