Как да накарам динамичен контрол на съдържанието да опреснява onChange?

Доста съм използвал динамичния контрол на съдържанието с формула за динамична страница, но тя винаги е била изчислявана при зареждане на страницата и не е променяна. Работих върху тест, при който искам да избера коя страница да се показва въз основа на разгъващ се списък и събитие 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
за Henrik Lauston - когато променя $ на #, тогава SSJS генерира грешка на редовете ‹xp:include, че Задължителното свойство pageName за xp:include не присъства. и на ред ‹xp:this.pageName грешка на Стойността на свойството pageName не може да бъде обвързване по време на изпълнение. така че изглежда, че pageName може да бъде дефинирано само при зареждане на страницата.   -  person Bill F    schedule 15.02.2015
comment
Да, съгласен съм с вашето заключение   -  person Per Henrik Lausten    schedule 15.02.2015


Отговори (2)


Можете да заредите динамично различни персонализирани контроли, ако redirect отидете на същата страница вместо пълно или частично опресняване и преди това запишете желаното име на персонализирана контрола в променлива на обхвата на сесията.

Тогава вашата тестова XPpage може да изглежда така:

    <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
Кнут - най-много ми харесва вторият вариант, никога не съм мислил да тръгвам в тази посока. Контролът на повторението е наистина мощен. - person Bill F; 17.02.2015
comment
Всъщност повторният контрол въвежда някои неочаквани странични проблеми. Имам някои изобразени области на някои от страниците, които извиквам и тъй като изобразеното идва след приложението за извикване, така че някакъв код в неизобразените повторения се задейства, което наистина причинява някои неочаквани резултати. Вярвам, че първото решение ще реши това, тъй като страниците не се зареждат. като пример имам същата персонализирана контрола със събитие след зареждане на страницата и тази контрола е на няколко от страниците, така че събитието след зареждане на страницата се задейства няколко пъти и обърква всичко. И така, обратно към чертожната дъска. - person Bill F; 23.02.2015

Както е описано по-горе, стойността за pageName може да бъде разрешена само при зареждане на страницата. Използвал съм този блок код за динамично дефиниране на страницата за зареждане на няколко места, но те винаги са били при зареждане на нова XPage, така че работи добре. В кода по-горе се опитвах да принудя pageName да бъде преизчислено при частично опресняване. Дори опитах пълна актуализация, но това не преизчислява името на страницата. Иска ми се, но тогава.... :-)

person Bill F    schedule 15.02.2015