以编程方式控制Dojo手风琴

时间:2009-02-25 23:44:50

标签: dojo accordion

我的页面上有一个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()
  3. 所以,只要你总是希望看到第一个项目,并且除了第一个项目之外没有实际扩展,这个代码“有效”:

       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 :(得分:0)

我相信我发现了一个问题 - accordian.removeChild()是不够的。如果你销毁它,那么行为似乎是正确的。我不知道你是否必须做两件事,或者如果自己毁灭就足够了。

因此,删除现有项目的代码变为:

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

我通过在第一项中提供“帮助信息”来解决这个限制......

答案 1 :(得分:0)

如果我没有误会......你应该......

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

87 accordion.addChild(pane1half,1);

答案 2 :(得分:0)

我每次都会创建一个新的AccordionContainer,添加AccordionPane孩子,然后执行:

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

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