2013-07-25 90 views
0

我有一個TabContainer,我添加ContentPanels。我的要求要求,我每次都重新加載此TabContainer(ContentPanels中的不同內容),我單擊網格上的新行(由同一頁面中的ajax生成)。 最初,當我遇到id已經註冊的問題時,我使用了destroyRecursive,正如在這裏的答案中的一個建議中所見。 現在,使用後,我得到以下結果:身份證已經註冊dojo

結果後,我點擊任何行,第一次: 就像我想要的方式,容器和3個內容窗格。

我點擊任何一行,第二次和任何其他時間後的結果: 具有3個內容窗格的新容器放在具有3個內容窗格的舊容器的頂部。 無論我點擊多少行,結果總是有2個容器,新的放在舊容器的上面。

下面是我用過的代碼。

<div id = "tabsContainer"> 
    <div id="tabPanels" data-dojo-type = "dijit/layout/TabContainer"></div> 
    </div> 
function getTabPanelsForTheRow() { 
     require(["dijit/layout/TabContainer", 
     "dijit/layout/ContentPane"], function (TabContainer, ContentPane) { 
      var tc = new TabContainer({}, "tabPanels"); 

      var cp1 = new ContentPane({ 
       title: "Contacts", 
       content: "These are the activities" 
      }); 
      tc.addChild(cp1); 

      var cp2 = new ContentPane({ 
       title: "Activities", 
       content: "These are the activities" 
      }); 
      tc.addChild(cp2); 

      var cp3 = new ContentPane({ 
       title: "Opportunities", 
       content: "We are known for our drinks." 
      }); 
      tc.addChild(cp3); 

      tc.startup(); 
     }); 
    } 

    function destroyTabPanel() { 
     require(["dijit/layout/TabContainer"], function (TabContainer) { 
      var tp = dijit.byId("tabPanels"); 
      tp.destroyRecursive(true); 
    }); 
} 

每次,我點擊一排,我米調用destroyTabPanel()首先,然後我打電話是getTabPanelsForTheRow()。

回答

0

在我看來你的問題是你的destroyRecursive()調用中的「真實」,它指示dojo保存DOM。所以你要銷燬已經解決了你的重複ID問題的小部件,但是生成的DOM會被保留;那麼當您撥打getTabPanelsForTheRow()時,它會在現有的面板上生成3個新的面板。

你想要做的是在致電destroyRecursive()後,在致電getTabPanelsForTheRow()之前清空容器「tabPanel」:domConstruct.empty("tabPanel")

在附註中,您每次單擊某行時都會銷燬並重新實例化面板小部件,爲什麼不在您的TabContainer中存儲對contentPanes的引用,然後編寫僅銷燬contentPanes的方法TabContainer節點,然後創建新窗格...

+0

謝謝你。我收到了您的第一個建議所需的結果。我是道場新手,因此無法獲得第二個建議。順便說一下,我試過這個:'function destroyTabPanel(){[dijit/layout/TabContainer','dojo/dom-construct'], function(TabContainer){var ejm = dijit.byId(「如果(elem.hasChildren()){ domConstruct.empty(「tabPanels」); } }); }' – Sandy

+0

在另一個函數中,我不直接創建新的TabContainer,而是直接說dijit.byId(「tabPanels」),其餘部分是相同的。當我這樣做時,我只能第一次創建面板。其餘的時間,我沒有顯示任何東西。 – Sandy

+0

您可以定義自己的擴展dijit._widgetBase的小部件,這個小部件將在您的容器'div'上聲明。小部件本身會實例化TabContainer和麪板,存儲對數組或對象中面板的引用。然後在頁面加載中實例化這個小部件。然後更改事件偵聽器,或者直接引用您的小部件並調用自定義方法「updatePanels」或其他東西,或者可以使用dojo的發佈/訂閱功能併發布小部件訂閱的請求。我可以發送一個例子,如果你喜歡... –