XPages — частичное обновление элемента управления аккордеоном из библиотеки расширений

Я пытаюсь частично обновить свой элемент управления аккордеоном (из библиотеки расширений). Я пробовал два подхода без успеха.

Проблема 1: Я попытался поместить элемент управления аккордеоном внутрь панели и попытался обновить панель, однако это приводит к ошибке dojo:

"Пытался зарегистрировать виджет с id==view:_id1:myaccordion, но этот id уже зарегистрирован"

Проблема 2: Я попытался напрямую обновить аккордеон по его идентификатору, но затем аккордеон сломался. Я не могу уничтожить управление аккордеоном, как рекомендуется по этой ссылке (http://www.mydominolab.com/2010/07/dijitdialog-inside-partial-refreshing.html), так как у него есть много других проблем, а ссылка конкретно касается управления диалогом, которое сильно отличается от аккордеона.

Не могли бы вы предложить мне что-нибудь? По сути, панель аккордеона здесь отображает количество документов, и я хотел бы своевременно обновить количество документов. Любая помощь будет действительно оценена.

Редактировать 1: просто добавить пример кода для справки (этот код приведет к проблеме 2, упомянутой выше, и если он будет окружен панелью и обновлен идентификатором панели, тогда возникнет проблема 1):

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:button value="Refresh" id="button1">
        <xp:eventHandler event="onclick" submit="true"
            refreshMode="partial" refreshId="accordion1">
        </xp:eventHandler></xp:button>
    <xp:br></xp:br>
    <xp:br></xp:br>
    <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:view>

Редактировать 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>

person Chintan Parekh    schedule 04.03.2014    source источник
comment
Не могли бы вы предоставить код, плз. Я не очень часто использую аккордеон, но когда я попытался обновить базовый пример, он сработал просто отлично.   -  person Michael Saiz    schedule 04.03.2014
comment
Только что обновил свой вопрос. Пожалуйста, дайте мне знать, если я что-то пропустил здесь ..   -  person Chintan Parekh    schedule 04.03.2014
comment
Я все еще экспериментирую, но я обнаружил интересный факт. Как только вы добавите dojoForm="true" в свой XPage, где вы используете аккордеон, он сломается, если вы обновите его частично также в своем рабочем примере.. поэтому он должен что-то делать с загруженными классами или с тем, как они обрабатываются, когда эта опция выбрана.   -  person Michael Saiz    schedule 06.03.2014
comment
Да, это сводит меня с ума. Кроме того, пожалуйста, взгляните на ссылку, указанную в вопросе. Было интересно, как реализовано диалоговое управление. Я не могу получить никакой подсказки для аккордеона, хотя. Надеюсь, это даст вам подсказку и поможет нам решить проблему здесь.   -  person Chintan Parekh    schedule 06.03.2014
comment
Ууу... есть рабочий пример, но я создал аккордеон с программным блоком скрипта, см. dojotoolkit.org/reference-guide/1.6/dijit/layout/: я могу частично обновить его сейчас, я попытаюсь создать небольшой пример, я не могу опубликовать здесь весь код (много строк ).   -  person Michael Saiz    schedule 06.03.2014


Ответы (1)


Проблема заключается в том, что когда вы частично обновляете доджо виджета аккордеона, он не создает виджет снова. Вы можете обойти это, программно создав виджет внутри блока скрипта. поэтому, если вы обновите панель своим блоком скрипта, он снова запустится и воссоздаст ваш виджет:

<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>

Единственная проблема заключается в том, что аккоридон снова закрывается, когда вы частично обновляете область, но это решение сработало для меня в Firefox и IE10 =)

person Michael Saiz    schedule 06.03.2014
comment
Интересный. Что ж, спасибо тебе. Это по крайней мере заставляет это работать. Но я не уверен, как блок сценария будет работать с моим кодом. Так как у меня есть контроль повтора и много других динамических переменных. Я знаю, что это можно сделать в библиотеке сценариев, но я думаю, что это станет более запутанным и менее удобным в сопровождении. Могли бы вы придумать другой способ? Я думал создать свой собственный аккордеон вместо использования jquery, так как это не сработало. :( - person Chintan Parekh; 06.03.2014
comment
Переместите свой повтор внутрь панели container1 или container2. Вы также можете создать новый контейнер, используя элемент управления повторением. Вам просто нужно передать идентификаторы контейнера в код CS, чтобы создать аккордеон. В jquery вам придется сделать то же самое =). - person Michael Saiz; 06.03.2014
comment
А, понял. Только что еще раз прошел код. Выглядит убедительно. Большое спасибо!.. Я думаю, это должно сработать.! Еще раз спасибо :) - person Chintan Parekh; 06.03.2014