【问题标题】:XPages JsonRPC - update ViewScopeXPages JsonRPC - 更新 ViewScope
【发布时间】:2017-10-11 15:54:42
【问题描述】:

我无法通过按钮 (onClick) 从 jsonRPC 设置 viewScope。 请参阅下面的代码。

我正在使用浏览器(FF/Chrome Mac 和 PC)访问 XPage。 单击按钮后,我按预期收到消息“RPC 完成”, 但未设置 viewScope。

<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)

<xp:label id="labelSetParamsBeforeOpeningDialog">
    <xp:this.value><![CDATA[#{javascript:
    var result = '';
try{
if(param.containsKey('runCode')){
if(param.runCode){
    var title = param.title;
    var width = param.width;
    var height = param.height;
    var dialogType = param.dialogType;

    var parentUnid = viewScope.get("currentDocUnid");

    var pageToOpen = "";
    switch(dialogType){
        case "one":
            //Dialog type specific code goes here
            pageToOpen = "dojoDialog_one.xsp?open&parent="+ parentUnid +"&dialog=true";
            break;

        case "two":
            viewScope.put("checkForConflicts", true);
            pageToOpen = 'dojoDialog_two.xsp?open&parent='+ parentUnid;
            break;

        case "three":
            pageToOpen = "dojoDialog_three.xsp?open&parent="+ parentUnid;
            break;

        default:
            pageToOpen = "error-page.xsp?open";
            break;
    }

    viewScope.put('dojoDialog_parentunid', parentUnid);
    viewScope.put('dojoDialog_pageToOpen', pageToOpen);
    viewScope.put('dojoDialog_title', title);
    viewScope.put('dojoDialog_width', width); 
    viewScope.put('dojoDialog_height', height); 
}
}

}catch (e){
    result = "ERROR:"+ e.message;
}

return result;
}]]></xp:this.value>
</xp:label>

按钮 - 运行 SSJS(标签)然后打开对话框(CSJS)

<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>

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>

【问题讨论】:

    标签: xpages xpages-ssjs xpages-extlib json-rpc


    【解决方案1】:

    据我所见,JSON RPC 根本不会更新组件树。所以viewScope 不能从 JSON RPC 调用中更新。见http://www.intec.co.uk/json-rpc-service-component-tree-manipulation-openlog/

    如果您想更新 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 代码 sn-p 所做的事情。
    • 嗨,保罗!感谢您的答复。我已经通过更新我的帖子澄清了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-20
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    相关资源
    最近更新 更多