Как заставить динамический элемент управления содержимым обновляться при изменении?

Я довольно часто использовал Dynamic Content Control с формулой Dynamic Page, но он всегда вычислялся при загрузке страницы и не менялся. Я работаю над тестом, в котором хочу выбрать, какую страницу отображать, на основе поля со списком и события onChange. Я выполнил полное обновление, а также несколько различных частичных обновлений, но оказалось, что страница вычисляется только при загрузке страницы. Страницы, которые это вызывает, ничего не делают, кроме как отображают «Страница первая», «Страница вторая» и т. д. Операторы печати печатаются только с начальной загрузки страницы. Я сделал частичное обновление «customeControlInclude», «dynamicContentView» и полное обновление в событии onChange поля со списком, но ни одно из них не приводит к тому, что dynamicControlView меняет загруженную страницу.

Итак, мой вопрос: «Есть ли способ заставить динамический элемент управления содержимым пересчитывать и отображать соответствующую страницу?

<?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"
    xmlns:xe="http://www.ibm.com/xsp/coreex">
    <xp:this.resources>
        <xp:script src="/js Utils.jss" clientSide="false"></xp:script>
    </xp:this.resources>
    <xp:panel id="thisPage">

        <xp:text escape="true" id="computedField1" value="#{sessionScope.ssSelectedView}"></xp:text>
        &#160;
        <xp:br></xp:br>
        <xp:br></xp:br>

        <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
            style="width:20%">
            <xp:selectItem itemLabel="Test One"></xp:selectItem>
            <xp:selectItem itemLabel="Test Two"></xp:selectItem>
            <xp:selectItem itemLabel="Test Three"></xp:selectItem>
            <xp:selectItem itemLabel="Test Four">
            </xp:selectItem>


            <xp:eventHandler event="onchange" submit="true"
                refreshMode="partial" refreshId="thisPage">
            </xp:eventHandler>
        </xp:comboBox>
        <xp:br></xp:br>
        <xp:panel id="panelView">
            <xp:table>
                <xp:tr>
                    <xp:td style="width:100.0%" valign="top">
                        <xe:dynamicContent id="dynamicContentView">
                            <xp:include id="customControlIncluder">
                                <xp:this.pageName>
                                    <![CDATA[${javascript:try{
    var debug:Boolean = true;
    if (debug) print("Select Page in xpMainInput.xsp");
    var viewName:String = sessionScope.ssSelectedView;
    var page:String = null;
    switch(viewName){
        case "test One" :
            page = "ccTestOne.xsp";
            break;
        case "Test Two" :
            page = "ccTestTwo.xsp";
            break;
        case "Test Three" :
            page = "ccTestThree.xsp";
            break;
        case "Test Four" :
            page = "ccTestFour.xsp";
            break
        //Add additional case statements for each additional Application
    }
    if (page == null){
        if (debug) print("Error in Main page is null ");
        return "ccTestOne.xsp";
    }else{
        if (debug) print("xpMain page = " + page)
        return page;
    }
}catch(e){
    print("Error Define Page in xpMain.xsp " + e.string());
}}]]>
                                </xp:this.pageName>
                            </xp:include>
                        </xe:dynamicContent>
                    </xp:td>

                </xp:tr>
            </xp:table>
        </xp:panel>
    </xp:panel>
</xp:view>

person Bill F    schedule 14.02.2015    source источник
comment
Что произойдет, если вы измените имя страницы, которое будет вычисляться каждый раз (поэтому измените '‹![CDATA[${javascript:try{'' на '‹![CDATA[#{javascript:try{'')?   -  person Per Henrik Lausten    schedule 15.02.2015
comment
Попробую. Спасибо   -  person Bill F    schedule 15.02.2015
comment
за Хенрика Лаустона - когда я меняю $ на #, SSJS выдает ошибку в строках ‹xp:include, что обязательное свойство pageName для xp:include отсутствует. и в строке ‹xp:this.pageName ошибка Значение свойства pageName не может быть привязкой времени выполнения. поэтому может показаться, что имя страницы можно определить только при загрузке страницы.   -  person Bill F    schedule 15.02.2015
comment
Да, я согласен с вашим выводом   -  person Per Henrik Lausten    schedule 15.02.2015


Ответы (2)


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

Ваш тестовый XPage может выглядеть так:

    <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
        style="width:20%">
        <xp:selectItem itemLabel="Test One" itemValue="ccTestOne.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Two" itemValue="ccTestTwo.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Three" itemValue="ccTestThree.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Four" itemValue="ccTestFour.xsp"></xp:selectItem>

        <xp:eventHandler event="onchange" submit="true"
            refreshMode="norefresh">
            <xp:this.action><![CDATA[#{javascript:
                facesContext.getExternalContext().redirect(context.getUrl().toString())
            }]]></xp:this.action>
        </xp:eventHandler>
    </xp:comboBox>

    <xp:br></xp:br>

    <xp:panel id="panelView">
        <xp:table>
            <xp:tr>
                <xp:td style="width:100.0%" valign="top">
                    <xp:include id="customControlIncluder">
                        <xp:this.pageName>
                            <![CDATA[${javascript:
                                !sessionScope.ssSelectedView ? "ccTestOne.xsp" : sessionScope.ssSelectedView
                            }]]>
                        </xp:this.pageName>
                    </xp:include>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>

В качестве альтернативы вы можете добавить все настраиваемые элементы управления в свой XPage с повторяющимся элементом управления с параметром repeatControls="true" и отображать только один настраиваемый элемент управления за раз в зависимости от переменной области видимости. Это работает с частичным обновлением.

    <xp:comboBox id="comboBox1" value="#{sessionScope.ssSelectedView}"
        style="width:20%">
        <xp:selectItem itemLabel="Test One" itemValue="ccTestOne.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Two" itemValue="ccTestTwo.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Three" itemValue="ccTestThree.xsp"></xp:selectItem>
        <xp:selectItem itemLabel="Test Four" itemValue="ccTestFour.xsp"></xp:selectItem>

        <xp:eventHandler event="onchange" submit="true"
            refreshMode="partial" refreshId="repeatCc">
        </xp:eventHandler>
    </xp:comboBox>

    <xp:br></xp:br>

    <xp:panel id="panelView">
        <xp:table>
            <xp:tr>
                <xp:td style="width:100.0%" valign="top">
                    <xp:repeat
                        id="repeatCc"
                        rows="100"
                        repeatControls="true"
                        var="cc"
                        value="#{javascript:['ccTestOne.xsp','ccTestTwo.xsp','ccTestThree.xsp','ccTestFour.xsp']}">
                        <xp:include
                             pageName="${cc}"
                             rendered="#{javascript: !sessionScope.ssSelectedView ? (cc === 'ccTestOne.xsp') : (cc === sessionScope.ssSelectedView)}" />
                    </xp:repeat>
                </xp:td>
            </xp:tr>
        </xp:table>
    </xp:panel>
person Knut Herrmann    schedule 16.02.2015
comment
Похоже, это будет работать хорошо, я просто пытался сделать это на самом низком уровне (частичное обновление), но в этом случае перенаправление, вероятно, было бы не таким уж плохим вариантом. Спасибо - person Bill F; 17.02.2015
comment
Я добавил еще один подход, который работает с частичным обновлением и также является гибким. - person Knut Herrmann; 17.02.2015
comment
Кнут - Мне больше нравится второй вариант, никогда не думал идти в этом направлении. Функция Repeat Control действительно мощная. - person Bill F; 17.02.2015
comment
На самом деле контроль повторения вводит некоторые неожиданные побочные проблемы. У меня есть некоторые визуализированные области на некоторых страницах, которые я вызываю, и поскольку визуализация происходит после вызова приложения, поэтому запускается некоторый код в неотрендеренных повторах, что действительно приводит к некоторым неожиданным результатам. Я считаю, что первое решение решит эту проблему, поскольку страницы не загружаются. например, у меня есть тот же настраиваемый элемент управления с событием после загрузки страницы, и этот элемент управления находится на нескольких страницах, поэтому событие после загрузки страницы срабатывает несколько раз и все портит. Итак, вернемся к чертежной доске. - person Bill F; 23.02.2015

Как описано выше, значение для pageName может быть разрешено только при загрузке страницы. Я использовал этот блок кода для динамического определения страницы для загрузки в нескольких местах, но они всегда были при загрузке нового XPage, поэтому он работал нормально. В приведенном выше коде я пытался принудительно пересчитать имя страницы при частичном обновлении. Я даже пробовал полное обновление, но оно не пересчитывает имя страницы. Хотелось бы, но тогда.... :-)

person Bill F    schedule 15.02.2015