Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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 beforeRenderResponse事件中未定义自定义控件的compositeData_Xpages - Fatal编程技术网

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

Xpages beforeRenderResponse事件中未定义自定义控件的compositeData,xpages,Xpages,向自定义控件传递数据时,我始终使用compositeData对象从控件内部访问此数据。除了自定义控件的beforeRenderResponse事件外,这一切正常。以该代码为例: <xp:this.afterPageLoad><![CDATA[#{javascript:getComponent("lbl0").setValue(typeof(compositeData));}]]></xp:this.afterPageLoad> <xp:this.befo

向自定义控件传递数据时,我始终使用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"/>

在afterPageLoad事件中,复合数据的类型为“com.ibm.xsp.binding.PropertyMap”。但在beforeRenderResponse事件中,相同类型的返回“未定义”

如何在beforeRenderResponse事件中访问合成数据?

在beforePageLoad或afterPageLoad中创建一个引用合成数据的SSJS变量:


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

尝试在“页面加载”上计算beforeRenderResponse,因此在计算页面加载事件时,使用$而不是#(),会出现错误:“getComponent()为null”。无论如何,在我的情况下,仅在页面加载时计算并不是一个真正的选项,因为我希望在自定义控件的参数更改时部分刷新该控件。根据我的观察,这不仅适用于compositeData,也适用于在xpage中定义的currentDocument和其他数据源。我以前也尝试过,但是这个技巧只在页面第一次加载时有效。当我部分刷新自定义控件时,助手变量(hlp)的typeof再次未定义,可能是因为“var hlp=compositeData;”在刷新期间未执行,并且hlp不再存在。没有注意到问题的“部分刷新”部分。我已经更新了我的答案。非常感谢你的解决方案。尽管我不明白为什么合成数据在beforeRenderResponse事件中不可用,但它现在工作正常。我希望您不介意我在您的回答中添加了几行,描述了自定义控件的属性不是静态的情况。compositeData不可用,因为它正在另一个上下文中“运行”(请参阅)。感谢您对动态属性的想法。但是目前你的编辑评论似乎有问题。。。我正试图找出原因。
<xp:this.beforePageLoad>
   <![CDATA[#{javascript:
      var hlp=compositeData;
   }]]>
</xp:this.beforePageLoad>
<xp:this.afterRenderResponse>
   <![CDATA[#{javascript:
      print( hlp.test );
   }]]>
</xp:this.afterRenderResponse>
<xc:ccWithId test="I am your property" id="ccWithId" />
<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>
 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
}