2017-12-20 7 views
0
<?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> 

jsonRpcService in addonload

Dieser Code einen Fehler in scriptBlock1 wirft:

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

Ich wundere mich darüber, weil ich es wie in scriptBlock1 in anderen, komplexeren xpages verwenden. Aber kann nicht den Grund finden, warum es dort arbeitet und nicht im einfachen Code oben. Irgendwelche Vorschläge?

+0

Versuchen Sie mit XSP.addOnLoad() anstelle von dojo.addOnLoad() –

+0

Kein Unterschied mit XSP.addOnLoad(). –

Antwort

0

Der Grund ist, weil die xe:jsonRPCService ein Skript im globalen XSP.addOnLoad Codeblock für Ihre ganze Seite ausgibt. Dieses Skript wird am Ende Ihrer Seite ausgegeben und von Ihrem Browser ausgewertet/ausgeführt, nachdem die ganze Seite geladen wurde.

Aber ein xp:script Block wird ein neues Standalone <script> Tag ausgeben, bevor der globale Block ausgeführt wurde, so dass die Variable rpcService zu diesem Zeitpunkt noch nicht erstellt wurde. Mit einer setTimeout-Funktion stellen Sie sicher, dass Ihr Skript ein wenig später ausgeführt wird, aber abhängig von der Browsergeschwindigkeit würde ich nicht wirklich darauf zählen.

Anstatt einen Skriptblock zu verwenden, könnten Sie versuchen, die SSJS view.postScript Funktion zu verwenden, um Ihr Skript in den globalen Lade-Skripten am Ende der Seite hinzuzufügen.

+0

Danke für die Erklärung. Wo/wie man view.postScript implementiert? Habe es noch nicht benutzt. Irgendwelche Beispiele? –

+0

view.postScript ist SSJS-Code. Innerhalb der postScript() - Methode könnten Sie Javascript (für den Browser) aufrufen. Aber auch diese Methode fügt das Javascript unten auf der Seite hinzu, das Ihr Problem beheben wird. Hier finden Sie ein Beispiel für die Verwendung von https://openntf.org/XSnippets.nsf/snippet.xsp?id=display-client-side-alert-if-server-side-validation-fails –