2009-02-25 24 views
0

我的頁面上有一個dijit.layout.AccordionContainer,它在html中定義,並在dojo在加載時解析頁面時創建。以編程方式控制Dojo手風琴

然後,當用戶與頁面交互時,我使用Ajax檢索數據並以編程方式填充容器(先移除現有項目)。

爲了說明我的問題簡單地說,這裏是一些代碼,不工作:

function doit() { 
     var accordion = dijit.byId("accordionShell"); 
     accordion.getChildren().each(function(item) { 
      accordion.removeChild(item); 
     }); 
     for (i = 1; i < 5; i++) { 
      var d = new dijit.layout.AccordionPane({title:'hello', content:'world'}); 
      accordion.addChild(d); 
     } 
    } 

這失敗,因爲只有在手風琴的第一個項目是可見的。我認爲其他人確實存在,但他們不可見,所以你什麼都做不了。

我設法繞過它:

  1. 務必確保更改後沒有在手風琴(所以我從來不刪除第一個孩子)
  2. 呼叫accordian.layout(1項)內容

所以,這個代碼「作品」只要你一直想看到的第一個項目,實際上沒有任何擴大,但第一個:

function doit() { 
     var accordion = dijit.byId("accordionShell"); 
     var i = 0; 
     accordion.getChildren().each(function(item) { 
      if (i > 0) accordion.removeChild(item); 
      i++; 
     }); 
     for (i = 1; i < 5; i++) { 
      var d = new dijit.layout.AccordionPane({title:'hello', content:'world'}); 
      accordion.addChild(d); 
     } 
     accordion.layout(); 

    } 

我正在使用Dojo 1.2.0 - 任何人都知道我在做什麼錯了?

回答

0

我相信我發現了一個問題 - accordian.removeChild()是不夠的。如果你摧毀它,那麼行爲似乎是正確的。我不知道你是否必須這樣做,或者如果自己破壞就足夠了。

因此,代碼以刪除現有的項目就變成了:

accordion.getChildren().each(function(item) { 
     if(i>0) { 
      accordion.removeChild(item); 
      item.destroy(); 
     } 
     i++; 
}); 

我正在解決此限制具有「幫助信息」中的第一項...

0

如果林不誤。 ..你應該這樣做...

pane1half = new dijit.layout.ContentPane({id: "pane1half", title: "hello", content: "world"}); 

87 accordion.addChild(pane1half,1);

+0

謝謝,但這並沒有改變任何東西。仍然需要在手風琴中留下一件物品。 – prule 2009-02-26 00:12:55

0

我將創建一個新AccordionContainer每次加AccordionPane孩子,然後做:

oldAccordion.domNode.parentNode.replaceChild(
    newAccordion.domNode, 
    oldAccordion.domNode 
); 

oldAccordion.destroyRecursive(); 
newAccordion.startup();