Event Forwarding"
Line 26: | Line 26: | ||
= Event Forwarding in ZUL = | = Event Forwarding in ZUL = | ||
− | Event forwarding can be done with the forward attribute in | + | Event forwarding can be done with [[ZUML Reference/ZUML/Attributes/forward|the forward attribute]] in ZUML. For example, |
<source lang="xml"> | <source lang="xml"> | ||
Line 43: | Line 43: | ||
</source> | </source> | ||
− | Of course, you can use the composer and | + | Of course, you can use the composer and ZUML's forward together to have more maintainable code. |
− | Notice that the event being forwarded is wrapped as an instance of <javadoc>org.zkoss.zk.ui.event.ForwardEvent</javadoc>. To retrieve the original event, you could invoke <javadoc method="getOrigin()">org.zkoss.zk.ui.event.ForwardEvent</javadoc> | + | <source lang="java"> |
+ | public class BetterComposer | ||
+ | extends org.zkoss.zk.ui.util.GenericForwardComposer { | ||
+ | public void onSave(ForwardEvent event) { | ||
+ | ... | ||
+ | </source> | ||
+ | |||
+ | Notice that, as shown above, the event being forwarded is wrapped as an instance of <javadoc>org.zkoss.zk.ui.event.ForwardEvent</javadoc>. To retrieve the original event, you could invoke <javadoc method="getOrigin()">org.zkoss.zk.ui.event.ForwardEvent</javadoc> | ||
+ | |||
+ | You could specify any application-specific data in the forward attribute by surrunding it with the parenthesis as shown below. | ||
+ | |||
+ | <source lang="xml" > | ||
+ | <button forward="onCancel(abort)"/><!-- "abort" is passed --> | ||
+ | <button forward="onPrint(${inf})"/><!-- the object returned by ${inf} is passed --> | ||
+ | </source> | ||
+ | |||
+ | Then, the application-specific data can be retrieved by use of <javadoc method="getData()">org.zkoss.zk.ui.event.ForwardEvent</javadoc>. | ||
+ | |||
+ | If you want to forward several events at once, you can specify them in the forward attribute by separating them with the comma (,). For example, | ||
+ | |||
+ | <source lang="xml" > | ||
+ | <textbox forward="onChanging=onUpdating, onChange=some.onUpdate"/> | ||
+ | </source> | ||
+ | |||
+ | In additions, the target component and the event data can be specified in EL expressions, while the event names cannot. | ||
=Version History= | =Version History= |
Revision as of 09:05, 8 April 2011
Overview
For easy programming, ZK does not introduce any complex event flow. When an event is sent to a target component, only the event listeners registered for the target component will be called. It is the application's job to forward an event to another component if necessary.
For example, you might have a menu item and a button to trigger the same action, say, opening a dialog, and then it is more convenient to have a single listener to open the dialog, and register the listener to the main window rather than register to both the menu item and button.
Event Forwarding in Java
Forwarding an event is straightforward: just post or send the event again. However, there is a better way: composer. The composer can be the central place to handle the events. For example, you could invoke openDialog
in the event handler for the menu item and button as shown below:
public class FooComposer extends GenericForwardComposer {
public void onClick$menuitem() {
openDialog();
}
public void onClick$button() {
openDialog();
}
private void openDialog() {
//whatever you want
}
}
Event Forwarding in ZUL
Event forwarding can be done with the forward attribute in ZUML. For example,
<window>
<button label="Save" forward="onSave"/>
<button label="Cancel" forward="onCancel"/>
</window>
Then, window will receive the onSave event when the Save button is clicked.
With this approach we could introduce an abstract layer between the event and the component. For example, window needs only to handle the onSave event without knowing which component causes it. Therefore, you could introduce another UI to trigger onSave without modifying the event listener. For example,
<menuitem label="Save" forward="onSave"/>
Of course, you can use the composer and ZUML's forward together to have more maintainable code.
public class BetterComposer
extends org.zkoss.zk.ui.util.GenericForwardComposer {
public void onSave(ForwardEvent event) {
...
Notice that, as shown above, the event being forwarded is wrapped as an instance of ForwardEvent. To retrieve the original event, you could invoke ForwardEvent.getOrigin()
You could specify any application-specific data in the forward attribute by surrunding it with the parenthesis as shown below.
<button forward="onCancel(abort)"/><!-- "abort" is passed -->
<button forward="onPrint(${inf})"/><!-- the object returned by ${inf} is passed -->
Then, the application-specific data can be retrieved by use of ForwardEvent.getData().
If you want to forward several events at once, you can specify them in the forward attribute by separating them with the comma (,). For example,
<textbox forward="onChanging=onUpdating, onChange=some.onUpdate"/>
In additions, the target component and the event data can be specified in EL expressions, while the event names cannot.
Version History
Version | Date | Content |
---|---|---|