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

    }

私はDojo1.2.0を使用しています-誰かが私が間違っていることを知っていますか?

4

3 に答える 3

0

私は1つの問題を見つけたと思います-accordian.removeChild()は十分ではありません。あなたがそれを破壊するならば、それから振る舞いは正しいようです。あなたが両方をしなければならないのか、それともそれ自体で破壊するだけで十分なのかはわかりません。

したがって、既存のアイテムを削除するコードは次のようになります。

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

最初の項目に「ヘルプ情報」を含めることで、この制限を回避しています...

于 2009-02-25T23:50:28.127 に答える
0

If Im not mistaking...you should do...

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

87 accordion.addChild(pane1half, 1);

于 2009-02-25T23:51:51.273 に答える