在xpage中,我希望能够决定必须呈现或加载哪些自定义控件。 我有一个名为1的自定义控件,另一个2,3等 当范围变量的值为1时,应显示/呈现/加载自定义控件1。 必须显示值2,自定义控件2。等
我提出了以下溶剂: 我计算是否必须加载自定义控件,具体取决于作用域变量的值。
由于我在1页上有8个这样的自定义控件,我想知道,因为这8个自定义控件中只有1个必须被渲染,如果没有更好的方法用更少的代码来完成相同的工作。我的解决方案不会给我的服务器带来很大的负担吗?
答案 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语句一样。
希望有所帮助。