Autor Thema: Full und partial refresh verknüpfen?  (Gelesen 4560 mal)

Offline Sarah Steffen

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Full und partial refresh verknüpfen?
« am: 26.06.12 - 15:11:19 »
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>

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?

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Full und partial refresh verknüpfen?
« Antwort #1 am: 26.06.12 - 16:41:51 »
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>

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
« Letzte Änderung: 26.06.12 - 17:21:44 von Sven Hasselbach »

Offline Sarah Steffen

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: Full und partial refresh verknüpfen?
« Antwort #2 am: 27.06.12 - 11:28:56 »
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>

Die executeOnServer-Funktion entspricht exakt der von XPages.info. Ich finde irgendwie den Fehler nicht..

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Full und partial refresh verknüpfen?
« Antwort #3 am: 27.06.12 - 11:51:06 »
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>

Offline Sarah Steffen

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: Full und partial refresh verknüpfen?
« Antwort #4 am: 27.06.12 - 18:03:54 »
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..

Offline Sven Hasselbach

  • Senior Mitglied
  • ****
  • Beiträge: 316
  • Geschlecht: Männlich
    • blog@hasselba.ch
Re: Full und partial refresh verknüpfen?
« Antwort #5 am: 27.06.12 - 20:12:13 »
Die Id hattest Du angepasst? Oder steht da noch das "label1"?

Offline Sarah Steffen

  • Frischling
  • *
  • Beiträge: 11
  • Geschlecht: Weiblich
Re: Full und partial refresh verknüpfen?
« Antwort #6 am: 28.06.12 - 08:22:45 »
Ja, habe ich angepasst; der Refresh selbst funktioniert ja auch.

Code
<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>

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz