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:
<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>
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?
In dem Fall würde ich ein Output-Scriptblock einfügen, der nur bei "Bedarf" gerendert wird:
Hier eine kleine Beispiel XPage:
<?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>
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 (http://xpagesblog.com/XPagesHome.nsf/Entry.xsp?documentId=88065536729EA065852578CB0066ADEC)
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:
<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>
Die executeOnServer-Funktion entspricht exakt der von XPages.info. Ich finde irgendwie den Fehler nicht..
Ich gehe mal davon aus, das Dojo noch nicht initialisiert ist, daher schlägt die Funktion fehl.
Probiers mal so:
<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>
Ja, habe ich angepasst; der Refresh selbst funktioniert ja auch.
<xp:eventHandler event="onfubar" id="eventhandler1a" submit="false">
<xp:this.action>
<![CDATA[#{javascript: print("foo bar");}]]>
</xp:this.action>
</xp:eventHandler>
<xp:scriptBlock id="scriptBlock1">
<xp:this.value><![CDATA[XSP.addOnLoad( function(){ 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>