在beforeRenderResponse事件中未定义自定义控件的compositeData

xpa*_*oob 5 xpages

将数据传递给自定义控件时,我总是使用compositeData对象从控件内部访问此数据.这个工作正常,除了自定义控件的beforeRenderResponse事件.以此代码为例:

<xp:this.afterPageLoad><![CDATA[#{javascript:getComponent("lbl0").setValue(typeof(compositeData));}]]></xp:this.afterPageLoad>
<xp:this.beforeRenderResponse><![CDATA[#{javascript:getComponent("lbl1").setValue(typeof(compositeData));}]]></xp:this.beforeRenderResponse>
<xp:label value="" id="lbl0"/>
<xp:label value="" id="lbl1"/>
Run Code Online (Sandbox Code Playgroud)

在afterPageLoad事件中,compositeData的typeof是"com.ibm.xsp.binding.PropertyMap".然而在beforeRenderResponse事件中,相同类型的返回"未定义".

如何在beforeRenderResponse事件中访问compositeData?

Sve*_*ach 6

beforePageLoadafterPageLoad创建与所述的基准的SSJS变量的CompositeData:

<xp:this.beforePageLoad>
   <![CDATA[#{javascript:
      var hlp=compositeData;
   }]]>
</xp:this.beforePageLoad>
Run Code Online (Sandbox Code Playgroud)

这允许您在渲染阶段访问PropertyMap.如果您有属性测试,则可以通过以下方式访问它:

<xp:this.afterRenderResponse>
   <![CDATA[#{javascript:
      print( hlp.test );
   }]]>
</xp:this.afterRenderResponse>
Run Code Online (Sandbox Code Playgroud)

编辑: 仅当页面打开(pageLoad)时才有效.如果刷新页面,则无效.如果必须使用部分刷新运行,则必须执行以下操作:

首先,您必须为自定义控件添加ID:

<xc:ccWithId test="I am your property" id="ccWithId" />
Run Code Online (Sandbox Code Playgroud)

这允许您使用getComponent()作为常规组件访问自定义控件.现在,您可以访问自定义控件事件中包含所需变量的组件的propertyMap:

<xp:this.beforeRenderResponse>
   <![CDATA[#{javascript:
      var cmp:com.ibm.xsp.component.UIIncludeComposite = getComponent("ccWithId");
      print("Value of 'test' -> " + cmp.getPropertyMap().getString("test") )
   }]]>
</xp:this.beforeRenderResponse>
Run Code Online (Sandbox Code Playgroud)

由xpages-noob编辑:上面的示例适用于静态自定义控件属性.但是,在计算属性的情况下,属性映射的各种get函数返回值绑定对象而不是值本身.因此,可以使用以下函数作为变通方法:

 var thisData:com.ibm.xsp.binding.PropertyMap=getComponent("ccWithId").getPropertyMap();
function getPara(key) {
    var x=thisData.get(key);
    if (@Ends(typeof(x),"ValueBinding")) return x.getValue(facesContext);
    else return x
}
Run Code Online (Sandbox Code Playgroud)

例如,如果要获取属性"test",请调用getPara("test").返回的值应该等于compositeData.test.