addOnLoad中的jsonRpcService

时间:2017-12-20 12:35:47

标签: xpages

<?xml version="1.0" encoding="UTF-8"?><xp:view xmlns:xp="http://www.ibm.com/xsp/core"
xmlns:xe="http://www.ibm.com/xsp/coreex">   
<xe:jsonRpcService
    id="jsonRpcService1"
    serviceName="rpcService">
    <xe:this.methods>
        <xe:remoteMethod
            name="machwas"
            script="MyBean.machwas() ;">
        </xe:remoteMethod>
    </xe:this.methods>
</xe:jsonRpcService>

<xp:scriptBlock id="scriptBlock1">
    <xp:this.value><![CDATA[dojo.addOnLoad(function() {
console.log( rpcService ) ;}) ;]]></xp:this.value>
</xp:scriptBlock>

<xp:scriptBlock id="scriptBlock2">
    <xp:this.value><![CDATA[dojo.addOnLoad(function() {
setTimeout( function(){ 
    console.log( rpcService ) ; 
}, 1 );});]]></xp:this.value>
</xp:scriptBlock>

此代码在scriptBlock1中抛出错误:

test.xsp:21 Uncaught ReferenceError: rpcService is not defined
at test.xsp:21
at _55c (dojo.js:15)
at $DDUS_ (dojo.js:15)
at $DDUT_ (dojo.js:15)
at $DDUR_ (dojo.js:15)
at HTMLDocument.$DDHs_ (dojo.js:15)

scriptBlock2可以工作。

我对此感到疑惑,因为我在其他更复杂的xpages中使用scriptBlock1。但是找不到它在那里工作的原因,而不是上面的简单代码。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

原因是xe:jsonRPCService正在整个页面的全局XSP.addOnLoad代码块中输出脚本。此脚本将在页面底部输出,并在整个页面加载后由浏览器评估/运行。

但是xp:script块会在执行全局块之前输出新的独立<script>标记,因此此时尚未创建变量rpcService。使用setTimeout函数将确保您的脚本稍后运行,但根据浏览器/速度,我不会真正依赖它。

您可以尝试使用SSJS view.postScript函数将脚本添加到页面底部的全局加载脚本中,而不是使用脚本块。