Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpages 计算自定义控件的渲染_Xpages - Fatal编程技术网

Xpages 计算自定义控件的渲染

Xpages 计算自定义控件的渲染,xpages,Xpages,在xpage中,我希望能够决定必须呈现或加载哪些自定义控件。 我有一个名为1的自定义控件,另一个名为2、3等 当作用域变量的值为1时,应显示/呈现/加载自定义控件1。 值为2时,必须显示自定义控件2。等 我提出了以下解决方案: 我根据作用域变量的值计算是否必须加载该自定义控件 因为我在一个页面上有8个自定义控件,所以我想知道,如果没有更好的方法用更少的代码来完成同样的工作,那么这8个自定义控件中只有1个必须被呈现。我的解决方案不会给我的服务器增加很多负载吗?更好的解决方案是动态注入自定义控件。这

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

我提出了以下解决方案: 我根据作用域变量的值计算是否必须加载该自定义控件


因为我在一个页面上有8个自定义控件,所以我想知道,如果没有更好的方法用更少的代码来完成同样的工作,那么这8个自定义控件中只有1个必须被呈现。我的解决方案不会给我的服务器增加很多负载吗?

更好的解决方案是动态注入自定义控件。这可以通过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);
    }
}
包ch.hasselba.xpages;
导入java.util.UUID;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入com.ibm.xsp.extlib.builder.ControlBuilder;
导入com.ibm.xsp.extlib.builder.ControlBuilder.ControlImpl;
导入com.ibm.xsp.component.uiite;
导入com.ibm.xsp.context.FacesContextExImpl;
导入com.ibm.xsp.util.FacesUtil;
公共类XPagesUtil{
public void injectCC(最终字符串ccName,最终字符串componentName){
FacesContextExImpl fc=(FacesContextExImpl)FacesContext.getCurrentInstance();
UIComponent cmp=FacesUtil.findChildComponent(fc.getViewRoot(),componentName);
UIIncludeComposite objCtrl=新UIIncludeComposite();
objCtrl.setPageName(ccName);
objCtrl.setId(“new_uid”+UUID.randomUUID());
ControlBuilder cBuilder=新的ControlBuilder();
ControlImpl objImplControl=新的ControlImpl(objCtrl);
ControlImpl objImplParent=新的ControlImpl(cmp);
objImplParent.addChild(objImplControl);
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了。

Sven的解决方案看起来非常出色,但同时也有点吓人。虽然我肯定会玩这个

有一个更“开箱即用”的可能性可能对你有用。扩展库的动态内容控件。我的理解是,它正是为此而设计的。您仍然需要预定义自定义控件(与Sven的Java注入不同),但动态内容控件的性能优于手动控制所有渲染。ext.library demo应用程序中有一个演示,但我使用了一个片段:

<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>
我想如果它真的有点像一个Switch语句


希望有帮助。

您看过扩展库了吗?它有一个动态负载控制。对于您的问题,文和大卫都有很好的解决方案,但请记住,这也取决于控件的内容。使用David Leedy的解决方案,我在与xe:dialog、xe:form和部分刷新的组合中遇到了一些麻烦,有时最好是简单地放置所有控件并计算加载的属性(使用bean)。尝试了这个,我必须说,它使代码更易于维护。我已经在afterpageload事件中选择了自定义控件。我不知道这是否是最好的解决方案性能。斯文,这是一个超级解决方案!)谢谢分享!我在DataTable中使用了这个解决方案,DataTable也是动态构建的。工作完美!对于使用此解决方案的其他人,有一个提示:确保父组件(在Sven的示例中为“cmp”)已绑定到ViewRoot中(作为子组件添加到ViewRoot.getChildren列表中),否则将得到NullPointerException。(如果您也动态生成父级,则可能会遇到此类问题)。@AndrewGrabovetskyi:您还可以签出一个特殊组件以注入自定义控件:
XSP.showContent("#{id:dynamic}","cat")
XSP.partialRefreshPost('#{id:mainPanel}', {})