XPages-从扩展库部分刷新手风琴控件

XPages-从扩展库部分刷新手风琴控件,xpages,xpages-extlib,Xpages,Xpages Extlib,我正在尝试对我的手风琴控件进行部分刷新(来自扩展库)。我尝试了两种方法,但都没有成功 问题1:我试图将accordion控件放在面板中并尝试刷新面板,但是,这导致dojo错误: “尝试注册id==view:_id1:myaccordion的小部件,但该id已注册” 问题2:我试图通过手风琴的id直接刷新手风琴,但是手风琴坏了。我不能破坏这个链接()上推荐的accordion控件,因为它还有许多其他问题,而且这个链接专门处理与accordion完全不同的对话框控件 你能给我提个建议吗?基本上,这里

我正在尝试对我的手风琴控件进行部分刷新(来自扩展库)。我尝试了两种方法,但都没有成功

问题1:我试图将accordion控件放在面板中并尝试刷新面板,但是,这导致dojo错误:

“尝试注册id==view:_id1:myaccordion的小部件,但该id已注册”

问题2:我试图通过手风琴的id直接刷新手风琴,但是手风琴坏了。我不能破坏这个链接()上推荐的accordion控件,因为它还有许多其他问题,而且这个链接专门处理与accordion完全不同的对话框控件

你能给我提个建议吗?基本上,这里的accordion窗格显示了文档的数量,我想及时刷新以更新计数。任何帮助都将不胜感激

编辑1:只需添加一个示例代码以供参考(此代码将导致上述问题2,如果被面板包围并由面板id刷新,则会出现问题1):


编辑2:如果在其周围添加了一个面板,则上述代码不起作用。在没有测试的情况下发布它是我的错误。然而,我发现实际的问题是Dojo布局,我正试图将其用于左侧导航。这是打破手风琴的示例代码

    <?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core" 
    xmlns:xc="http://www.ibm.com/xsp/custom"
    pageTitle="S4EP TEAMGROUND"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:button value="Refresh" id="button1">
        <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="myPanel">
        </xp:eventHandler></xp:button>
        <xp:div id="body" dojoType="dijit.layout.BorderContainer"
            style="height:100%;width:100%;align:center;">
            <xp:this.dojoAttributes>
                <xp:dojoAttribute name="persist" value="false"></xp:dojoAttribute>
                <xp:dojoAttribute name="gutters" value="false"></xp:dojoAttribute>
            </xp:this.dojoAttributes>
            <xp:div id="left" dojoType="dijit.layout.ContentPane"
                style="width:220px;height:50%">
                <xp:this.dojoAttributes>
                    <xp:dojoAttribute name="region" value="left"></xp:dojoAttribute>
                    <xp:dojoAttribute name="splitter" value="true"></xp:dojoAttribute>
                </xp:this.dojoAttributes>
                    <xp:panel id="myPanel">
<xe:accordion id="accordion1">
        <xe:this.treeNodes>
            <xe:basicContainerNode label="Accordion 1">
                <xe:this.children>
                    <xe:basicLeafNode label="Category x"></xe:basicLeafNode>
                </xe:this.children></xe:basicContainerNode>
            <xe:basicContainerNode label="Accordion 2">
                <xe:this.children>
                    <xe:basicLeafNode label="Category y"></xe:basicLeafNode>
                </xe:this.children></xe:basicContainerNode> 

        </xe:this.treeNodes></xe:accordion>
</xp:panel>

            </xp:div>
        </xp:div>
</xp:view>

问题在于,当您部分刷新手风琴小部件时,dojo不会再次创建小部件。您可以通过在脚本块中以编程方式创建小部件来解决这个问题。因此,如果使用脚本块刷新面板,它将再次执行并重新创建小部件:

<xp:div id="body"   dojoType="dijit.layout.BorderContainer" style="height:100%;width:100%;align:center;">
        <xp:this.dojoAttributes>
            <xp:dojoAttribute name="persist" value="false"></xp:dojoAttribute>
            <xp:dojoAttribute name="gutters" value="false"></xp:dojoAttribute>
        </xp:this.dojoAttributes>
        <xp:div id="left"   dojoType="dijit.layout.ContentPane" style="width:220px;height:50%">
            <xp:this.dojoAttributes>
                <xp:dojoAttribute name="region" value="left"></xp:dojoAttribute>
                <xp:dojoAttribute name="splitter" value="true"></xp:dojoAttribute>
            </xp:this.dojoAttributes>
            <xp:panel id="myPanel">
                <xp:panel id="leftAccordion">
                    <xp:scriptBlock type="text/javascript">
                        <xp:this.value><![CDATA[
                            dojo.require("dijit.layout.AccordionContainer");
                            dojo.require("dijit.layout.ContentPane");

                            XSP.addOnLoad(function() {
                                var aContainer = new dijit.layout.AccordionContainer({
                                    style: "width:220px;height:50%"
                                },
                                "#{id:leftAccordion}");

                                aContainer.addChild(new dijit.layout.ContentPane({
                                    title: "This is a content pane"
                                },'#{id:container1}'));

                                aContainer.addChild(new dijit.layout.ContentPane({
                                    title: "This is as well"
                                },'#{id:container2}'));

                                aContainer.startup();
                            });]]></xp:this.value>
                    </xp:scriptBlock>
                    <xp:panel id="container1">
                        <xp:text escape="true" id="computedField1">
                            <xp:this.value><![CDATA[#{javascript:"Entry "+ @Now().toLocaleTimeString();}]]></xp:this.value>
                        </xp:text>
                    </xp:panel>
                    <xp:panel id="container2">
                        <xp:text escape="true"  id="computedField2">
                            <xp:this.value><![CDATA[#{javascript:"Entry "+ @Now().toLocaleTimeString();}]]></xp:this.value>
                        </xp:text>
                    </xp:panel>
                </xp:panel>
            </xp:panel>
        </xp:div>
    </xp:div>

您可以使用container1或container2向手风琴添加按钮,也可以通过编程方式创建按钮,请参见。此处显示部分刷新按钮:

<xp:button
    value="Refresh"
    id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="partial"
        refreshId="myPanel">
    </xp:eventHandler>
</xp:button>


唯一的问题是,当您部分刷新该区域时,accoridon会再次关闭,但该解决方案在Firefox和IE10=)中对我有效。

您能提供一些代码plz吗。我不经常使用手风琴,但当我尝试刷新一个基本的例子时,效果很好。只是更新了我的问题。如果我遗漏了什么,请告诉我。我还在试验,但我发现了一个有趣的事实。一旦您将
dojoForm=“true”
添加到您使用手风琴的XPage中,如果您在工作示例中也部分刷新它,它将中断。。因此,它必须与加载的类有关,或者在选择此选项时如何处理它们。是的,这让我发疯。另外,请看一下问题中共享的链接。对话框控件的处理方式很有趣。不过,我对手风琴一无所知。希望它能给你一些提示,帮助我们解决这个问题。。有一个工作示例,但我用编程的脚本块创建了一个acordion,请参见“”:我现在可以部分刷新它,我将尝试创建一个小示例,但无法在此处发布整个代码(许多行)。很有趣。好的,谢谢你。这至少让它起作用了。但是,我不确定脚本块如何与我的代码一起工作。因为我有重复控制和许多其他动态变量。我知道这可以在脚本库中完成,但我认为它会变得更混乱,更不易维护。你能想出别的办法吗?我想用jquery来构建我自己的手风琴,因为它不起作用(将您的repeat移动到面板container1或container2中。您还可以使用repeat控件创建新容器。您只需将容器的ID传递给CS代码即可创建acordion。在jquery中,您必须执行相同的操作=)。啊,明白了。只是又检查了一遍代码。看起来很有说服力。谢谢!。。我想这应该能奏效。!再次感谢:)
<xp:button
    value="Refresh"
    id="button1">
    <xp:eventHandler
        event="onclick"
        submit="true"
        refreshMode="partial"
        refreshId="myPanel">
    </xp:eventHandler>
</xp:button>