Mit Domino 8.5.3 ist der neue HTTP Header ‚X-XspRefreshId‘ eingeführt worden, mit dem sich die refreshId eines Partial Refreshs vom Server aus verändern lässt. Dadurch ist es möglich, ein Element zu refreshen, dass Ergebnis dieser Operation jedoch auf ein anderes Element im Client anzuwenden.
Hier ein kleines Beispiel anhand einer XPage, die vor dem Partial Refresh wie folgt aussieht:
Der Code der XPage ist ebenfalls simpel, ausser das bei einem Partial Refresh der XPage ein Header an den Request angefügt wird. Dazu wird das Event afterRestoreView genutzt.
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:this.afterRestoreView><![CDATA[#{javascript: var exCon = facesContext.getExternalContext(); var writer = facesContext.getResponseWriter(); var response = exCon.getResponse(); response.setHeader("X-XspRefreshId", getClientId('label2') ); }]]> </xp:this.afterRestoreView> <xp:button value="Label" id="button1"> <xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="label1"> </xp:eventHandler> </xp:button> <xp:br></xp:br> <xp:br></xp:br> <xp:label value="Label1" id="label1"></xp:label> <xp:br></xp:br> <xp:br></xp:br> <xp:label value="Label2" id="label2"></xp:label> </xp:view>
Der Button löst einen Partial Refresh auf das Label label1 aus, der dazugehörige Request, der an den Server gesendet wird liefert auch den zu erwartenden HTML-Code zurück:
<span id="view:_id1:label1" class="xspTextLabel">Label1</span>
Doch nun kommt der zusätzliche Header ins Spiel. Er bewirkt, dass nicht das label1 ersetzt wird, sondern das Element label2:
Durch den in der HTTP Header in der Antwort des Servers wurde das XSP-Objekt dazu veranlasst, den HTML-Code im DOM-Baum an einer anderen Stelle zu ersetzen.
In diesem kleinen Beispiel tritt ein kleiner Seiteneffekt auf: Das Label mit der id label2 verschwindet komplett aus dem DOM-Baum. Betätigt man den Button ein zweites Mal, funktioniert der Refresh nicht mehr, und folgende Fehlermeldung erscheint im Browser:
Pingback: XSnippets: Cancel a partial refresh via SSJS | blog@hasselba.ch