0

ZK3.6.3中的Page添加的Listener可以监听所有的子组件的事件吗?

asked 2009-11-23 05:42:12 +0800

zikmember gravatar image zikmember
6

根据Developers Guide的第5章的Add and Remove Event Listeners to Pages Dynamically小节:

Developers could add event listeners to a page (org.zkoss.zk.ui.Page) dynamically. Once added, all events of the specified name the are sent to any components of the specified page will be sent to the listener.

但是我试了却不行,根据源代码来看,似乎也不可以。不知道大家是否可以,还是文档没有及时更新?

附:我是ZK新手:)

delete flag offensive retag edit

5 Replies

Sort by » oldest newest

answered 2009-11-23 19:20:20 +0800

adam4891288 gravatar image adam4891288
657 1 5

Hi zik
我刚才测试了,page的确可以监听到其中组件的事件。
代码如下:
index.zul

<zk>
<window id="win" apply="Comps.Index">
<button id="download" label="download"/>	
</window>
</zk>


Index.java
public class Index extends GenericForwardComposer {
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		Page page = (Page) Executions.getCurrent().getDesktop().getPages().iterator().next();
		page.addEventListener("onClick", new Listener());
		
	}
	class Listener implements org.zkoss.zk.ui.event.EventListener{
		public void onEvent(Event event) throws Exception {
			alert("123");
		}
		
	}
}

link publish delete flag offensive edit

answered 2009-11-24 08:54:38 +0800

zikmember gravatar image zikmember
6

谢谢adam4891288的回复,你的代码我试了,确实可以。不过仍然有一些疑问,我将代码改为如下:

index.zul

<zk>
<window id="win" apply="Comps.Index">
  <button id="download" label="download"/>
  <tree>
	<treechildren>
		<treeitem label="XXX">
		</treeitem>
		<treeitem label="YYY">
		</treeitem>
	</treechildren>
</tree>
</window>
</zk>

Index.java

public class Index extends GenericForwardComposer {
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		Page page = (Page) Executions.getCurrent().getDesktop().getPages().iterator().next();
		page.addEventListener("onClick", new Listener());
		page.addEventListener("onSelect", new Listener2());
	}
	class Listener implements org.zkoss.zk.ui.event.EventListener{

		@Override
		public void onEvent(Event event) throws Exception {
			alert("123");
		}
	}
	class Listener2 implements org.zkoss.zk.ui.event.EventListener{

		@Override
		public void onEvent(Event event) throws Exception {
			alert("456");
		}
	}
}

这样的话,如果点击树的Item时发出的OnSelect Event是不会立即触发监听器的,而是在onClick事件触发后,才会跟着触发OnSelect事件,这是为什么?谢谢!

link publish delete flag offensive edit

answered 2009-11-24 19:08:23 +0800

adam4891288 gravatar image adam4891288
657 1 5

Hi zik

的确如你所说,onSelect事件触发后只是作为一个类似于缓存队列的事件队列存在,而不执行监听器内的方法,只有当onClick事件触发后才一并按顺序执行。
针对此问题我又测试了多种事件,例如onChange,onChanging,onPaging等等,发现这些事件的行为都是不甚相同的。例如onPaging就类似于onClick可以立即监听到,但是却一下子执行两次监听器的onEvent方法。而onChange则类似于onSelect,要onClick或者onPaging这样的事件触发后才会触发,而onChanging干脆就监听不到。
当然,这究竟是为什么,我也不得而知,因为我也没有深入研究ZK的源码,估计还是里面的事件传输机制造成的。我也希望得到本论坛的技术专家的解答。

link publish delete flag offensive edit

answered 2009-11-24 19:09:44 +0800

jimmyshiau gravatar image jimmyshiau
4921 5
http://www.zkoss.org/ ZK Team

如果不用 treeitem 改成 treecell 呢

link publish delete flag offensive edit

answered 2009-11-24 22:37:19 +0800

adam4891288 gravatar image adam4891288
657 1 5

经测试treeitem与treecell效果一样,因为onSelect是在tree里监听的

link publish delete flag offensive edit
Your reply
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a substantial answer, for discussions, please use comments and please do remember to vote (after you log in)!

[hide preview]

Question tools

Follow

RSS

Stats

Asked: 2009-11-23 05:42:12 +0800

Seen: 458 times

Last updated: Nov 24 '09

Support Options
  • Email Support
  • Training
  • Consulting
  • Outsourcing
Learn More