XPages JsonRPC-更新视图范围
我无法通过按钮(onClick)从jsonRPC设置viewScope。 请参阅下面的代码 我正在使用浏览器(FF/Chrome Mac和PC)访问XPage。 单击按钮后,我会按预期收到消息“RPC done”, 但未设置viewScopeXPages JsonRPC-更新视图范围,xpages,xpages-ssjs,xpages-extlib,json-rpc,Xpages,Xpages Ssjs,Xpages Extlib,Json Rpc,我无法通过按钮(onClick)从jsonRPC设置viewScope。 请参阅下面的代码 我正在使用浏览器(FF/Chrome Mac和PC)访问XPage。 单击按钮后,我会按预期收到消息“RPC done”, 但未设置viewScope <xe:jsonRpcService id="myRpc" serviceName="myRpcService"> <xe:this.methods> <xe:remoteMethod name="se
<xe:jsonRpcService id="myRpc" serviceName="myRpcService">
<xe:this.methods>
<xe:remoteMethod name="setDialogValues">
<xe:this.script><![CDATA[var success = false;
try {
viewScope.put("dojoDialog_title", "Window title");
success = true;
} catch (e) {
success = false;
}
return success;]]></xe:this.script>
</xe:remoteMethod>
</xe:this.methods>
</xe:jsonRpcService>
<xp:button value="Set viewScope via RPC" id="setVSButton">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[var remoteMethod = myRpcService.setDialogValues();
remoteMethod.addCallback(function(response){
if(response===true){
alert("RPC done");
}else{
alert("ERROR");
}
});]]></xp:this.script>
</xp:eventHandler>
</xp:button>
编辑:
我最终想要实现的是为dojo对话框设置ViewScope参数。该对话框通过CSJS打开,读取ViewScope变量并显示正确的页面、大小和标题
我成功尝试的是在打开对话框之前使用标签设置ViewScope。我的经验告诉我,这是一个快速而肮脏的解决方案,可能随时崩溃和烧毁。在运行CSJS之前,一定有更好/正确的方法来设置ViewScope或运行SSJS吗
请参阅下面的代码摘录
标签-执行SSJS(为对话框设置ViewScope)
按钮-运行SSJS(标签),然后打开对话框(CSJS)
Dojo对话框-读取ViewScope
<xe:dialog id="inPlaceDialog" style="height:auto;width:auto"
dojoType="com.ZetaOne.widget.Dialog">
<xe:this.title>
<![CDATA[#{javascript:var title =
viewScope.get("dojoDialog_title");return title;}]]>
</xe:this.title>
<xe:this.dojoAttributes>
<xp:dojoAttribute name="autofocus" value="false"></xp:dojoAttribute>
</xe:this.dojoAttributes>
<xc:global_dojoDialog_iframe
elementSRC="#{javascript:applicationScope.dbPath}/#
{javascript:viewScope.dojoDialog_page}"
elementUnid="#{javascript:viewScope.dojoDialog_unid;}"
elementParentUnid="#{javascript:viewScope.dojoDialog_parentunid;}"
elementDialogWidth="#{javascript:viewScope.dojoDialog_width;}"
elementDialogHeight="#{javascript:viewScope.dojoDialog_height;}">
</xc:global_dojoDialog_iframe>
<xp:eventHandler event="onShow" submit="false">
<xe:this.script><![CDATA[dojo.query("img[aria-label='close
button']").forEach(function(el){
el.src = "blank_x.gif";
});]]></xe:this.script>
</xp:eventHandler>
</xe:dialog>
据我所知,JSON RPC根本不会更新组件树。因此,无法从JSON RPC调用更新
viewScope
。看
如果要更新viewScope,我不知道为什么要在部分刷新(GET或POST)上使用JSON RPC调用。好的,谢谢!您建议我如何通过部分更新设置viewScope?我希望在调用中包含一个属性:“setDialogParameter(windowName)”。我以前使用过标签,但发现它们不可靠。这是我以前尝试过的代码:XSP.partialRefreshGet(“#{id:labelSetParams}”,{params:{$$xspsubmitvalue':null},onComplete:function(){XSP.openDialog('{id:inPlaceDialog}');});我不确定我是否理解你想要实现的目标。如果您试图以编程方式影响对话框标题,我将计算它并使用SSJS/Java显示对话框,这将导致所需的部分刷新。退一步想想,SSJS/Java只能在服务器上运行,对话框只能在浏览器上显示。使用后端调用来显示对话框已经完成了上面JavaScript代码片段所做的工作。嗨,Paul!谢谢你的回复。我通过更新我的帖子澄清了这个问题。
<xp:button value="Show dialog three" id="myButton">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[
var title = 'THREE';
var width = 1200;
var height = 440;
var dialogType = 'three';
XSP.partialRefreshGet("#{id:labelSetParamsBeforeOpeningDialog}",
{
params: {"runCode":true, "title":title, "width":width, "height":height,"dialogType":dialogType},
onStart: function(){
//nothing
},
onError: function(){
alert("ERROR")
},
onComplete: function(){
XSP.openDialog('#{id:inPlaceDialog}');
}
});]]></xp:this.script>
</xp:eventHandler>
</xp:button>
<xe:dialog id="inPlaceDialog" style="height:auto;width:auto"
dojoType="com.ZetaOne.widget.Dialog">
<xe:this.title>
<![CDATA[#{javascript:var title =
viewScope.get("dojoDialog_title");return title;}]]>
</xe:this.title>
<xe:this.dojoAttributes>
<xp:dojoAttribute name="autofocus" value="false"></xp:dojoAttribute>
</xe:this.dojoAttributes>
<xc:global_dojoDialog_iframe
elementSRC="#{javascript:applicationScope.dbPath}/#
{javascript:viewScope.dojoDialog_page}"
elementUnid="#{javascript:viewScope.dojoDialog_unid;}"
elementParentUnid="#{javascript:viewScope.dojoDialog_parentunid;}"
elementDialogWidth="#{javascript:viewScope.dojoDialog_width;}"
elementDialogHeight="#{javascript:viewScope.dojoDialog_height;}">
</xc:global_dojoDialog_iframe>
<xp:eventHandler event="onShow" submit="false">
<xe:this.script><![CDATA[dojo.query("img[aria-label='close
button']").forEach(function(el){
el.src = "blank_x.gif";
});]]></xe:this.script>
</xp:eventHandler>
</xe:dialog>