Domino 9 und frühere Versionen > ND8: Entwicklung - XPages
Full und partial refresh verknüpfen?
Sarah Steffen:
Hallo zusammen,
ich arbeite zZt. an einer Variante beim Erstellen von Dokumenten im TabContainer, bei der folgendes passieren soll:
- User klickt auf "erstellen" und gibt die Daten ein
- User klickt auf speichern, Daten werden in einer Managed Bean gespeichert (funktioniert soweit)
- automatisch wird ein neues Tab geöffnet mit dem eben erstellten Dokument im Anzeigemodus
- der alte Tab schliesst sich
Dieser angestrebte Tab-Wechsel ergibt sich dadurch, dass wir fürs Anlegen bzw. Anzeigen von Dokumenten verschiedene Custom Controls benutzen.
Nun bin ich auf das Problem gestoßen, dass das Speichern der Bean nur bei einem full refresh (<xp:eventHandler event="onclick" submit="true">) funktioniert, die Tab-Operationen wiederum nur bei einem partial refresh (<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="tab_wrapper" execMode="partial">). Bisher habe ich es trotz tagelangem Rumprobieren nicht hinbekommen, dass beide Aktionen ausgeführt werden.
Hier die beiden Event Handler:
--- Code: ---<xp:eventHandler event="onclick" submit="true">
<xp:this.action>
<![CDATA[#{javascript: viewScope.put("temp_employee_id",hrmEmployee.save(getComponentValue('txt_employee_costcenter')));}]]>
</xp:this.action>
</xp:eventHandler>
<xp:eventHandler event="onclick" submit="true" refreshMode="partial" refreshId="tab_wrapper" execMode="partial">
<xp:this.action>
<![CDATA[#{javascript:openContainerTab(viewScope.get("temp_employee_id"), "fm_hrm_employee", "openDocument");}]]>
</xp:this.action>
</xp:eventHandler>
--- Ende Code ---
Die Methode hrmEmployee.save(...) speichert die Bean und gibt die NoteID des neu erzeugten Dokuments zurück, mit der dann das neue Tab aufgemacht werden soll.
Wie kann ich den zweiten Event Handler nach Abschluss des ersten anstossen?
Sven Hasselbach:
In dem Fall würde ich ein Output-Scriptblock einfügen, der nur bei "Bedarf" gerendert wird:
Hier eine kleine Beispiel XPage:
--- Code: ---<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:button value="Label" id="button1">
<xp:eventHandler event="onclick" submit="true">
<xp:this.action>
<![CDATA[#{javascript: requestScope.doPartial = "1" }]]>
</xp:this.action>
</xp:eventHandler>
</xp:button>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[alert("HUHU!")]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript:requestScope.doPartial === "1"}]]></xp:this.rendered>
</xp:scriptBlock>
</xp:view>
--- Ende Code ---
Im Scriptblock kann das Event dann Clientseitig neu getriggert werden.
EDIT:
Wie man ein Event Clientseitig ausführt, steht übrigens hier: http://xpagesblog.com/XPagesHome.nsf/Entry.xsp?documentId=88065536729EA065852578CB0066ADEC
Sarah Steffen:
Danke für die schnelle Antwort, das mit dem Skript-Block funktioniert und mein tab wrapper wird auch refreshed - allerdings wird mein sevrerside Event Handler nicht ausgeführt. Die executeOnServer-Funktion wird schon an anderer Stelle in der Applikation verwendet, und da funktionierts.
Hier mein aktueller Code:
--- Code: ---<xp:eventHandler event="onfubar" id="eventhandler1a" submit="false">
<xp:this.action>
<![CDATA[#{javascript: getComponent("tab_document").closeTab();}]]>
</xp:this.action>
</xp:eventHandler>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[executeOnServer('eventhandler1a', dojo.query('[id$="tab_wrapper"]')[0].id);]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript:requestScope.get("doPartial") === "1"}]]></xp:this.rendered>
</xp:scriptBlock>
--- Ende Code ---
Die executeOnServer-Funktion entspricht exakt der von XPages.info. Ich finde irgendwie den Fehler nicht..
Sven Hasselbach:
Ich gehe mal davon aus, das Dojo noch nicht initialisiert ist, daher schlägt die Funktion fehl.
Probiers mal so:
--- Code: ---<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad( function(){ executeOnServer('eventhandler1a', dojo.query('[id$="label1"]')[0].id) });]]></xp:this.value>
<xp:this.rendered><![CDATA[#{javascript:requestScope.get("doPartial") === "1"}]]></xp:this.rendered>
</xp:scriptBlock>
--- Ende Code ---
Sarah Steffen:
Habe es genau so ausprobiert, das Ergebnis ist aber das selbe. Ich habe in den Event Handler zum Test mal nur ein Print-Statement gesetzt, auch das wird leider nicht ausgeführt. Wahrscheinlich spuckt mir da irgendwas ganz anderes in die Suppe, mal sehen..
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln