<?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。但是找不到它在那里工作的原因,而不是上面的简单代码。有什么建议吗?
答案 0 :(得分:0)
原因是xe:jsonRPCService
正在整个页面的全局XSP.addOnLoad
代码块中输出脚本。此脚本将在页面底部输出,并在整个页面加载后由浏览器评估/运行。
但是xp:script
块会在执行全局块之前输出新的独立<script>
标记,因此此时尚未创建变量rpcService
。使用setTimeout函数将确保您的脚本稍后运行,但根据浏览器/速度,我不会真正依赖它。
您可以尝试使用SSJS view.postScript
函数将脚本添加到页面底部的全局加载脚本中,而不是使用脚本块。