Domino 9 und frühere Versionen > ND8: Entwicklung - XPages
Partial refresh aktualisiert auch andere Elemente
Sven Hasselbach:
Das ist meine Beobachtung, die leider ein anderes Ergebnis auf der Konsole liefert. Ich habe die obige XPage um einen Zeitstempel für den Output ergänzt und einen Debug-PhaseListener dazwischen geschaltet. Zur Verdeutlichung habe ich jeweils den Code des Buttons inkl. der Ausgabe auf der Serverkonsole gepostet.
Hier der Code der Datatable:
--- Code: ---<xp:dataTable id="dataTable1" rows="30">
<xp:this.value><![CDATA[#{javascript:
print(java.lang.System.currentTimeMillis() + ' You shall not refresh');
}]]></xp:this.value>
<xp:column id="column1" />
</xp:dataTable>
--- Ende Code ---
Button
--- Code: ---<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="col1" />
</xp:button>
--- Ende Code ---
1. Öffnen der XPage
--- Code: ---19.02.2012 18:02:17 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:02:17 HTTP JVM: 1329670937472 You shall not refresh
19.02.2012 18:02:17 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
2. Partial Refresh
--- Code: ---19.02.2012 18:05:37 HTTP JVM: Before phase: RESTORE_VIEW 1
19.02.2012 18:05:37 HTTP JVM: After phase: RESTORE_VIEW 1
19.02.2012 18:05:37 HTTP JVM: Before phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:05:37 HTTP JVM: 1329671137733 You shall not refresh
19.02.2012 18:05:37 HTTP JVM: After phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:05:37 HTTP JVM: Before phase: PROCESS_VALIDATIONS 3
19.02.2012 18:05:37 HTTP JVM: After phase: PROCESS_VALIDATIONS 3
19.02.2012 18:05:37 HTTP JVM: Before phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:05:37 HTTP JVM: After phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:05:37 HTTP JVM: Before phase: INVOKE_APPLICATION 5
19.02.2012 18:05:37 HTTP JVM: After phase: INVOKE_APPLICATION 5
19.02.2012 18:05:37 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:05:37 HTTP JVM: 1329671137769 You shall not refresh
19.02.2012 18:05:37 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
Die Berechung der DataTable erfolgt zwei Mal, das Element wurde nicht refresht.
Ändere ich den Code des Buttons auf Partial Execution, ist das Ergebnis wie folgt:
Button
--- Code: ---<xp:button value="Label" id="button1" execMode="partial">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="col1" />
</xp:button>
--- Ende Code ---
1. Öffnen der XPage
--- Code: ---19.02.2012 18:13:54 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:13:54 HTTP JVM: 1329671634490 You shall not refresh
19.02.2012 18:13:54 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
2. Partial Refresh
--- Code: ---19.02.2012 18:14:02 HTTP JVM: Before phase: RESTORE_VIEW 1
19.02.2012 18:14:02 HTTP JVM: After phase: RESTORE_VIEW 1
19.02.2012 18:14:02 HTTP JVM: Before phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:14:02 HTTP JVM: 1329671642321 You shall not refresh
19.02.2012 18:14:02 HTTP JVM: After phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:14:02 HTTP JVM: Before phase: PROCESS_VALIDATIONS 3
19.02.2012 18:14:02 HTTP JVM: After phase: PROCESS_VALIDATIONS 3
19.02.2012 18:14:02 HTTP JVM: Before phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:14:02 HTTP JVM: After phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:14:02 HTTP JVM: Before phase: INVOKE_APPLICATION 5
19.02.2012 18:14:02 HTTP JVM: After phase: INVOKE_APPLICATION 5
19.02.2012 18:14:02 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:14:02 HTTP JVM: 1329671642360 You shall not refresh
19.02.2012 18:14:02 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
Selbst wenn ich das Event explizit auf Partial Execution setze, wird der Code berechnet (aber wenigstens nur noch einmal im Render Response)
Button
--- Code: ---<xp:button value="Label" id="button1" execMode="partial">
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="col1" execMode="partial"/>
</xp:button>
--- Ende Code ---
1. Öffnen der XPage
--- Code: ---19.02.2012 18:23:17 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:23:17 HTTP JVM: 1329672197161 You shall not refresh
19.02.2012 18:23:17 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
2. Partial Refresh
--- Code: ---19.02.2012 18:23:18 HTTP JVM: Before phase: RESTORE_VIEW 1
19.02.2012 18:23:18 HTTP JVM: After phase: RESTORE_VIEW 1
19.02.2012 18:23:18 HTTP JVM: Before phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:23:18 HTTP JVM: After phase: APPLY_REQUEST_VALUES 2
19.02.2012 18:23:18 HTTP JVM: Before phase: PROCESS_VALIDATIONS 3
19.02.2012 18:23:18 HTTP JVM: After phase: PROCESS_VALIDATIONS 3
19.02.2012 18:23:18 HTTP JVM: Before phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:23:18 HTTP JVM: After phase: UPDATE_MODEL_VALUES 4
19.02.2012 18:23:18 HTTP JVM: Before phase: INVOKE_APPLICATION 5
19.02.2012 18:23:18 HTTP JVM: After phase: INVOKE_APPLICATION 5
19.02.2012 18:23:18 HTTP JVM: Before phase: RENDER_RESPONSE 6
19.02.2012 18:23:18 HTTP JVM: 1329672198875 You shall not refresh
19.02.2012 18:23:18 HTTP JVM: After phase: RENDER_RESPONSE 6
--- Ende Code ---
Selbst das Setzen der execId auf col1 ändert nichts - der Refresh führt immer zu einer Neuberechnung der DataTable (wenn auch nur einmal)...
Sven
eknori (retired):
@Sven: Vielen Dank für die wirklich ausführlichen Informationen. Werde heute noch einmal in Ruhe testen. Denke, ich werde zu dem gleichen Ergebnis kommen. Evtl. habe ich gestern irgend etwas durcheinander gebracht.
Da das Ergebnis nun offensichtlich feststeht, heisst es nun in der Folge, alle Stellen im Code zu prüfen und den Workaround zu implementieren. Ein gutes Stück Arbeit; wird sich aber lohnen.
eknori (retired):
Habe noch einmal getestet. Gleiches Ergebnis wie Sven.
Workaround ist schon an einigen Stellen implementiert. Der Unterschied ist gewaltig.
Wer sich also über schlechte Performance seiner Anwendung wundert, der sollte mal in dieser Richtung suchen. ...
eknori (retired):
Und ich habe noch etwas gefunden, was mir nicht wirklich logisch erscheint:
Auch event handler werden bei einem partial refresh getriggert, wenn sie ausserhalb der refrehId liegen ( in RENDER_RESPONSE phase )
1. zum Einen wird der Code unnötig ausgeführt
2. das Ergebnis des PR wird erst dann angezeigt, wenn der Code abgearbeitet wurde
Entweder habe ich ein Verständnisproblem, oder es läuft hier etwas Grundlegendes falsch ...
Sven Hasselbach:
Bei Output-Scriptblöcken war das unter 8.5.2 auch der Fall, aber ist wohl mitlerweile (8.5.3) behoben worden.
Das der Partial Refresh erst komplett ist, wenn die Renderphase abgeschlossen ist, ist aber so wie es sein sollte, denn dann wird die Response erst an den Client gesendet.
Auch ein
--- Code: ---var response = facesContext.getExternalContext().getResponse();
response.flushBuffer();
--- Ende Code ---
hilft da nix...
Ich denke das es sich hierbei schlichtweg um einige Bugs in der Implementierung handelt.
Navigation
[0] Themen-Index
[#] Nächste Seite
[*] Vorherige Sete
Zur normalen Ansicht wechseln