2009-02-25 2 views
0

У меня есть dijit.layout.AccordionContainer на моей странице, которая определена в html и создана, когда доджо анализирует страницу при загрузке.Программный контроль Аккордеона 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); 
     } 
    } 

Это терпит неудачу, потому что только первый элемент в Accordian виден. Я думаю, что другие на самом деле существуют, но они не видны, поэтому вы ничего не можете сделать.

я сумел обойти это:

  1. Всегда есть обеспечение 1 пункт в Accordian (так что я никогда не удалить первый ребенок)
  2. Вызов accordian.layout() после изменения параметров содержание

Таким образом, этот код «работает» до тех пор, как вы всегда хотите, чтобы увидеть первый элемент, а на самом деле не расширять любой, кроме первой:

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

0

Я хотел бы создать новую AccordionContainer каждый раз, добавьте детей AccordionPane, а затем сделать:

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

oldAccordion.destroyRecursive(); 
newAccordion.startup(); 
Смежные вопросы