2012-03-13 73 views
1

有什麼方法可以通過initComponent函數訪問父組件(通過this.ownerCt)嗎?ExtJS4:initComponent函數中的this.ownerCt

在嘗試通過this.ownerCt訪問它時,我發現ownerCt屬性在之後設置爲initComponent。所以我不知道我可以在我的組件的初始化過程中掛鉤,我可以改變一些父母的屬性。

+0

你究竟想達到什麼目的? – sha 2012-03-13 11:44:46

+0

我正在嘗試構建一個麪包屑導航,因此我想將當前的「路徑」添加到父級的tbar。 – wessnerj 2012-03-13 11:48:40

+0

ownerCt是包含當前組件的容器。你能否更詳細地解釋它究竟會如何工作?你想創建什麼樣的組件,以及如何構建麪包屑...... – sha 2012-03-13 11:51:48

回答

1

我知道這並不直接回答問題。我會把這個放在對你的問題的評論中,但我不允許它會出現。如果你正在建造麪包屑。我會考慮擴展選項卡面板併爲選項卡欄創建一個插件,以創建您想要的導航類型。

Ext.define('HOD.plugins.Breadcrumbs', { 

    // private 
    init : function(tabBar) { 
     tabBar.on('beforeadd', this.addIcons, this); 
     tabBar.on('beforeremove', this.handleTabRemove, this); 
    }, 

    addIcons: function(tabBar, newTab, index, options) { 
     if (index > 0) { 
      newTab.iconCls = 'icon-arrow'; 
      tabBar.items.each(function(tab) { 
       if (tab != newTab) { 
        tab.overCls = 'breadcrumbs-over' 
       } 
      }); 
     } 
    }, 

    handleTabRemove: function(tabBar, oldTab, options) { 
     var count = tabBar.items.getCount(); 
     if (count > 1) { 
      var newTab = tabBar.items.getAt(count-2); 
      newTab.overCls = ''; 
      newTab.removeCls('x-tab-breadcrumbs-over'); 
     } 
    } 
}); 

然後擴展標籤面板,使其使用上面的插件正確地設置標籤的樣式。

Ext.define('HOD.view.GlobalNavigation', { 
    extend: 'Ext.tab.Panel', 
    border: false, 
    alias: 'widget.content', 
    requires: ['HOD.plugins.Breadcrumbs'], 
    tabBar: { 
     cls: 'breadcrumbs', 
     plugins: ['tabbarbreadcrumbs'] 
    }, 

    initComponent: function() { 
     this.on('tabchange', this.handleTabChange, this); 
     this.callParent(arguments); 
    }, 

    push: function(tab) { 
     this.add(tab); 
     this.setActiveTab(tab); 
    }, 

    pop: function() { 
     // Get the current cards; 
     var cards = this.getLayout().getLayoutItems(); 
     if (cards.length > 1) { 
      this.setActiveTab(cards[cards.length-2]); 
     } 
    }, 

    handleTabChange: function (tabPanel, newCard, oldCard, options) { 
     var cards = tabPanel.getLayout().getLayoutItems(); 

     for (var i = (cards.length - 1); i > 0; i--) { 
      if (cards[i] !== newCard) { 
       this.remove(cards[i]); 
      } else { 
       break; 
      } 
     } 
    } 
}); 

我已經寫了一篇關於它here if you need more detail

+0

傑出的工作傑米 - 你應該在Sencha論壇發佈你的插件。 – dbrin 2012-03-14 04:41:49

+0

我會做的。一旦我將它們稍微清理一下以供公共消費,我就會在不久的將來在github上提供一些UI部分。 – 2012-03-21 19:59:15

0

我不會推薦在內部元素函數中更改容器中的任何東西。相反,我會在元素中創建一個事件,觸發該事件並在容器中偵聽它。

這樣你的組件會通知容器做些什麼,容器會自己做。