XPages寻呼机刷新问题

XPages寻呼机刷新问题,xpages,xpages-extlib,Xpages,Xpages Extlib,我有一个问题,寻呼机执行部分刷新,因为我们有服务器端重定向规则,完全刷新不是一个选项在这里。如果我将寻呼机放在同一页而不是自定义控件中,则它会刷新主面板。但是如果我将寻呼机放在自定义控件中,那么它只更新repeat控件,这意味着寻呼机控件本身不会刷新。下面是一个简单的例子来说明这个问题 <?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core" xmlns:xc="

我有一个问题,寻呼机执行部分刷新,因为我们有服务器端重定向规则,完全刷新不是一个选项在这里。如果我将寻呼机放在同一页而不是自定义控件中,则它会刷新主面板。但是如果我将寻呼机放在自定义控件中,那么它只更新repeat控件,这意味着寻呼机控件本身不会刷新。下面是一个简单的例子来说明这个问题

<?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">
    <xp:panel id="mainPanel">
        <xc:ccPager pagerFor="repeat1" id="myPager" />
        <xp:repeat id="repeat1" rows="3" var="row">
            <xp:this.value><![CDATA[#{javascript:var cars = ["Saab", "Volvo", "BMW", "Saab", "Volvo", "BMW"];
return cars; }]]></xp:this.value>
            <xp:text escape="true" id="computedField1" value="#{row}">
            </xp:text>
        </xp:repeat>
    </xp:panel>
</xp:view>
下面是自定义控件的代码:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:pager layout="Previous Group Next" partialRefresh="true"
        id="pager1" for="#{compositeData.pagerFor}" partialExecute="false">
    </xp:pager>
</xp:view>
<div id="page-result" class="pagination pagination-small clearfix">
    <div class="col-lg-12 pagination clearfix">
        <div class="results form-inline left">
            <fieldset>
                <xp:pager id="pager1" alwaysCalculateLast="true"
                    for="#{compositeData.strPagerFor}" styleClass="pag-control"
                    partialRefresh="true" partialExecute="false">
                    <xp:pagerControl id="pagerControl1" type="FirstImage"
                        styleClass="firstPage" image="/PagerArrowhead2-L_d.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl2" type="PreviousImage"
                        styleClass="previousPage" image="/PagerArrowhead-L_d.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl5" type="Group"
                        currentStyleClass="active" styleClass="pages">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl3" type="NextImage"
                        styleClass="nextPage" image="/PagerArrowhead.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl4" type="LastImage"
                        styleClass="lastPage" image="/PagerArrowhead2.png">
                    </xp:pagerControl>
                </xp:pager>
                <label>
                    <xp:text escape="true" id="computedField1" value="#{compositeData.strLabelText}" />
                </label>
            </fieldset>
        </div>
        <div class="results form-inline">
            <fieldset>
                <label> Results per page: </label>
                <xe:pagerSizes id="pagerSizes1" for="#{compositeData.strPagerFor}"
                    sizes="7|15|25|50|all" text="{0}" styleClass="resultPage"
                    partialRefresh="true" partialExecute="false"
                    refreshId="#{compositeData.strRefreshPanel}" />
            </fieldset>
        </div>
    </div>
</div>
欢迎提供任何提示。在本例中,寻呼机很简单,但我有一个更复杂的寻呼机和一个包含45行源代码的pagesizes控件,因此如果可能的话,我更愿意创建一个可重用的自定义组件

使现代化 我的当前寻呼机自定义控件:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:pager layout="Previous Group Next" partialRefresh="true"
        id="pager1" for="#{compositeData.pagerFor}" partialExecute="false">
    </xp:pager>
</xp:view>
<div id="page-result" class="pagination pagination-small clearfix">
    <div class="col-lg-12 pagination clearfix">
        <div class="results form-inline left">
            <fieldset>
                <xp:pager id="pager1" alwaysCalculateLast="true"
                    for="#{compositeData.strPagerFor}" styleClass="pag-control"
                    partialRefresh="true" partialExecute="false">
                    <xp:pagerControl id="pagerControl1" type="FirstImage"
                        styleClass="firstPage" image="/PagerArrowhead2-L_d.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl2" type="PreviousImage"
                        styleClass="previousPage" image="/PagerArrowhead-L_d.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl5" type="Group"
                        currentStyleClass="active" styleClass="pages">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl3" type="NextImage"
                        styleClass="nextPage" image="/PagerArrowhead.png">
                    </xp:pagerControl>
                    <xp:pagerControl id="pagerControl4" type="LastImage"
                        styleClass="lastPage" image="/PagerArrowhead2.png">
                    </xp:pagerControl>
                </xp:pager>
                <label>
                    <xp:text escape="true" id="computedField1" value="#{compositeData.strLabelText}" />
                </label>
            </fieldset>
        </div>
        <div class="results form-inline">
            <fieldset>
                <label> Results per page: </label>
                <xe:pagerSizes id="pagerSizes1" for="#{compositeData.strPagerFor}"
                    sizes="7|15|25|50|all" text="{0}" styleClass="resultPage"
                    partialRefresh="true" partialExecute="false"
                    refreshId="#{compositeData.strRefreshPanel}" />
            </fieldset>
        </div>
    </div>
</div>

我以前遇到过这个问题。我认为这是因为视图容器在单独的自定义控件中时找不到寻呼机。我假设它使用的是像getComponent这样的东西,它无法向下导航到自定义控件,因此它无法找到寻呼机来更新它

能否将pagesizes控件的代码提取到Java dataObject/bean/util或dataContext/SSJS库中?然后用一行SSJS或EL引用它

另一种选择是使用插件并构建一个组件来扩展repeat控件并将寻呼机添加到相关的头中


Tim Tripcony给出了一个快速而肮脏的演示示例:

你在哪里指定要更新的面板?你是否考虑过将自定义控件放置到重复控件的头面中?它就是这样工作的。感谢Serdar,为了将它放在重复控件的页眉和页脚部分,我们需要进行重大的设计更改,但这是一个解决方案,尽管如此,我还是会尝试一下。Steve,这是寻呼机控件的问题,您无法指定要更新的面板!但正如我在示例中所述,如果将寻呼机放在xpage上,它将更新整个页面。另一个解决方案是实现一个新组件,该组件继承repeat控件或其呈现程序。只是为了抓取分页事件并进行自我刷新。也许,即使是自定义渲染器也足够了。不过,如果没有看到代码本身,可能会更加困难。谢谢Paul提出了一些有趣的想法,所以这不是一个快速解决方案。