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);
        }
    }

这失败了,因为只有手风琴中的第一个项目是可见的。我认为其他人确实存在,但它们不可见,因此您无能为力。

我设法通过以下方式绕过它:

  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 - 有人知道我做错了什么吗?

4

3 回答 3

0

我每次都会创建一个新的 AccordionContainer,添加 AccordionPane 子项,然后执行以下操作:

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

oldAccordion.destroyRecursive();
newAccordion.startup();
于 2009-02-26T18:39:42.093 回答
0

如果我没记错的话……你应该这样做……

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

87 手风琴.addChild(pane1half, 1);

于 2009-02-25T23:51:51.273 回答
0

我相信我发现了一个问题——accordian.removeChild() 是不够的。如果你破坏它,那么行为似乎是正确的。我不知道您是否必须两者都做,或者单独销毁是否就足够了。

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

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

我正在通过在第一项中包含“帮助信息”来解决此限制...

于 2009-02-25T23:50:28.127 回答