计算自定义控件的渲染

时间:2014-05-27 08:20:03

标签: xpages

在xpage中,我希望能够决定必须呈现或加载哪些自定义控件。 我有一个名为1的自定义控件,另一个2,3等 当范围变量的值为1时,应显示/呈现/加载自定义控件1。 必须显示值2,自定义控件2。等

我提出了以下溶剂: 我计算是否必须加载自定义控件,具体取决于作用域变量的值。

由于我在1页上有8个这样的自定义控件,我想知道,因为这8个自定义控件中只有1个必须被渲染,如果没有更好的方法用更少的代码来完成相同的工作。我的解决方案不会给我的服务器带来很大的负担吗?

2 个答案:

答案 0 :(得分:3)

更好的解决方案是动态注入自定义控件。这可以通过java轻松完成:

package ch.hasselba.xpages;

import java.util.UUID;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.extlib.builder.ControlBuilder;
import com.ibm.xsp.extlib.builder.ControlBuilder.ControlImpl;
import com.ibm.xsp.component.UIIncludeComposite;
import com.ibm.xsp.context.FacesContextExImpl;
import com.ibm.xsp.util.FacesUtil;

public class XPagesUtil {

    public void injectCC( final String ccName , final String componentName ){
        FacesContextExImpl fc = (FacesContextExImpl) FacesContext.getCurrentInstance();
        UIComponent cmp = FacesUtil.findChildComponent(fc.getViewRoot(), componentName );
        UIIncludeComposite objCtrl = new UIIncludeComposite();
        objCtrl.setPageName( ccName );
        objCtrl.setId("new_" + UUID.randomUUID() );
        ControlBuilder cBuilder = new ControlBuilder();
        ControlImpl<UIIncludeComposite> objImplControl = new ControlImpl<UIIncludeComposite>(objCtrl);
        ControlImpl<UIComponent> objImplParent =  new ControlImpl<UIComponent>(cmp);
        objImplParent.addChild(objImplControl);
        cBuilder.buildControl(fc,objImplParent,false);
    }
}

要使用XPage上的代码,您现在可以执行以下操作:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.afterPageLoad>
        <![CDATA[#{javascript:
            importPackage( ch.hasselba.xpages.extlib );
            var nameOfCC = "/IncludeCC.xsp";
            new ch.hasselba.xpages.XPagesUtil().injectCC(nameOfCC, "parent");
        }]]>
    </xp:this.afterPageLoad>

    <xp:div id="parent" />
</xp:view>

您现在可以计算变量 nameOfCC

答案 1 :(得分:2)

Sven的解决方案看起来绝对精彩,同时也有点吓人。虽然我肯定会玩那个。

还有更多“开箱即用”的可能性可能对您有用。扩展库的动态内容控制。我的理解是它的设计正是为了这个。您仍需要预定义自定义控件(与Sven的Java注入不同),但动态内容控件的性能更佳,然后尝试手动控制所有渲染。分机上有一个演示。图书馆演示应用程序但是我使用过的片段:

<xe:dynamicContent
                id="dynamic">
                <xp:this.facets>

                    <xp:panel
                        xp:key="cat">
                        <xc:cc_form_category></xc:cc_form_category>
                    </xp:panel>
                    <xp:panel
                        xp:key="subCategory">
                        <xc:cc_form_subCategory></xc:cc_form_subCategory>
                    </xp:panel>
                    <xp:panel
                        xp:key="rental">
                        <xc:cc_form_rentalID></xc:cc_form_rentalID>
                    </xp:panel>
                    <xp:panel
                        xp:key="default">default content</xp:panel>

                </xp:this.facets>
            </xe:dynamicContent>

这基本上是自定义控件的设置。当我想展示一个或做出改变时,我一直在使用一些客户端JavaScript。

XSP.showContent("#{id:dynamic}","cat")
XSP.partialRefreshPost('#{id:mainPanel}', {})

我认为如果它真的像Switch语句一样。

希望有所帮助。