Программное управление аккордеоном Dojo - PullRequest
0 голосов
/ 26 февраля 2009

На моей странице есть 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);
        }
    }

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

Мне удалось обойти это:

  1. Всегда следите за тем, чтобы в аккордеоне был 1 элемент (поэтому я никогда не удаляю первого ребенка)
  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 - Кто-нибудь знает, что я делаю неправильно?

Ответы [ 3 ]

0 голосов
/ 26 февраля 2009

Если я не ошибаюсь ... вы должны сделать ...

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

87 accordion.addChild (pane1half, 1);

0 голосов
/ 26 февраля 2009

Я бы каждый раз создавал новый AccordionContainer, добавлял дочерние элементы AccordionPane, затем делал:

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

oldAccordion.destroyRecursive();
newAccordion.startup();
0 голосов
/ 26 февраля 2009

Мне кажется, я нашел одну проблему - accordian.removeChild () недостаточно. Если вы уничтожите его, то поведение будет правильным. Я не знаю, нужно ли вам делать и то, и другое, или достаточно уничтожить саму себя.

Итак, код для удаления существующих элементов становится:

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

Я работаю над этим ограничением, имея «справочную информацию» в первом пункте ...

...