1

JSTLページには、次のdivがあります

<div dojoType="dijit.layout.TabContainer" style="width: 100%; height: 100%;" doLayout="false" id="dojoTabbedPane" >
            <c:forEach items="${summariesMap}" var="summaryEntry">
                <div dojoType="dijit.layout.ContentPane" title="${summaryEntry.key}">

その下にあるすべての contentPane を再帰的に破棄するために、(dojoTabbedPane を含む) 下にあるすべての div を見つけようとします。次に、jQuery.load() を使用してコンテンツをリロードし、

dojo.parser.parse(dijit.byId("dojoTabbedPane"));

コンポーネントを再解析して、tabbedPane をレンダリングできることを確認します (そうしないとレンダリングできず、メモリ リークやエラーが発生します)。

質問は次のとおりです: (1) Dojo TabbedContainer を再解析する正しい方向に進んでいますか? (2) findWidgets 関数が毎回サイズ 0 の配列を返すのはなぜですか?

前もって感謝します。

4

1 に答える 1

1

最初に2つ答えます。dijit.findWidgetsはウィジェットではなくDOMノードを想定しているためです。別のウィジェット内のすべてのウィジェットを検索する必要がある場合は、代わりにgetDescendantsを使用できます。

var descWidgets = dijit.byId("dojoTabbedPane").getDescendants();

質問1:最初に:TabContainerのすべてのタブを破棄する場合は、次を使用できます。

dijit.byId("dojoTabbedPane").destroyDescendants();

さて、私があなたを正しく理解していれば、その後、サーバーからHTMLの文字列を(jQueryを使用して)取得し、それをTabContainerに追加したいとします。この新しいコンテンツにはいくつかのContentPanedivが含まれており、これらをTabContainerの新しいタブにします。

私はここで間違っているかもしれませんが、それはいくつかの厄介なハックなしでは実行できないと思います。TabContainerを解析/インスタンス化したら、addChildを使用してタブを追加し、インスタンス化されたContentPanesを渡す必要があります。

これは、サーバーから(jQueryロードを介して)このような新しいHTMLコンテンツを取得した場合:

<div dojoType="dijit.layout.ContentPane" title="new tab1">foo</div>
<div dojoType="dijit.layout.ContentPane" title="new tab2">bar</div>

..次に、最善の策は、古いTabContainerを削除して新しいものを作成してから、すべてを解析することです。サーバーから取得するコンテンツを変更できる場合は、おそらくそれをでラップすることができます<div dojoType="dijit.layout.TabContainer...

于 2012-06-04T15:36:45.273 に答える