ZK技术,单个组件刷新问题 本帖最后由 xvvvx 于 2013-01-30 23:12:01 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 <button label="查詢" onClick="@command('Query')"/> <tabbox id="tb" height="600px"> <tabs id="tabs"> <tab id="test01" label="資訊"/> <tab id="test02" label="test"/> </tabs> <tabpanels> <tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel> <tabpanel><include src="/mvc/test0202Info/test02Info.zul"/></tabpanel> </tabpanels> </tabbox>目前在Query方法里我把整个页面跳转回本页面,两个include进来的window才有值,我想实现不要跳转本页面,只刷新这个tabbox组件,有没有办法实现,各位帮帮忙啊 ZK后台你可以直接操作tabbox的。在你的点击按钮事件中://获得tabbox对象Tabbox tb = self.getFellowIfAny("tabbox");//对tabbox进行操作 ZK是基于AJAX的,所有的操作都可以异步刷新。后台对象操作,均可在页面中体现出。 就是卡在對tabbox刷新的操作上,請問應該怎麼写,Thanks! ZK是我几个月前做的,现在大致看代码告诉你吧:我这里用的是apply<window id="payApplyPlanMgrWin" width="100%" border="0" position="center,top" height="100%" apply="${testMgrController}"><Tabbox id="yourtabbox"></Tabbox><toolbarbutton label="测试" onClick="controller.myTest(self)"></toolbarbutton>在你的TestMgrController类中,定义yourtabbox对象然后在你的按钮单击事件myTest中就可以操作yourtabbox了,yourtabbox应该有很多属性的,如://获得子对象集合List<org.zkoss.zk.ui.Component> list = yourtabbox.getChildren();//设置式样yourtabbox.setStyle等等。直接对yourtabbox这个对象操作即可。 总的来说就一句话,ZK页面的对象和你后台对象可以一一对应,你对后台对象的操作,都可以体现到页面上。感觉ZK做一些ERP类的应用还行,做网站类的就不行了,性能不好,封装的太多了。 能告诉我刷新这个组件的操作怎么写吗,我网上查了,用tabbox.invalidate();但是没反应 你可以用个按钮点击事件来刷新tabbox啊,我现在手头上没有环境,只能凭记忆告诉你。tabbox可能也有点击的事件,不确定, 跟你说下我的问题吧,我现在的问题就是想在按钮点击事件中刷新这个tabbox,但不知道怎么来刷新它,也没找到刷新这个组件的方法 这个是ZUL中的按钮+按钮的单击事件<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />你的controller中定义refresh()方法。在refresh()方法中://获得你的tabbox对象Tabbox tb = self.getFellowIfAny("tabbox");然后对tb操作即可。还不明白吗?? 你可以先试试更改下它的式样,你就知道了。tb.setStyle(""); 我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了 TO:我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了 你要不在你的controller中定义private Tabbox tbx;再添加getset方法。tbx和你ZUL文件中Tabbox的ID一致即可。tbx就是你的Tabbox对象,操作完执行下:tbx.renderAll(); 我按照你说的试了一下,打印出来的tbx是null,而且tbx下也没有renderAll()这个方法 说明你<window id="payApplyPlanMgrWin" width="100%" border="0" position="center,top" height="100%" apply="${testMgrController}">这个绑定没成功。 是不是你的按钮和你的tabbox在不同的window里? 贴代码吧,把ZUL和类都贴出来 zul就是之前貼的那些了zul:<window id="win" title="for info query" width="100%" border="normal" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('com.xpx.mvc.info0001idquery.info0001idQueryViewModel')"><grid> <rows> <row> <div sclass="field-title">关键字</div> <div> <textbox value="@bind(vm.infoDO.id)" maxlength="50"/> </div> </row> </rows> </grid><button label="查詢" onClick="@command('Query')"/> <tabbox id="tb" height="600px"><tabs id="tabs"><tab id="test01" label="資訊"/><tab id="test02" label="test02"/></tabs><tabpanels><tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel><tabpanel><include src="/mvc/test02Info/test02Info.zul"/></tabpanel></tabpanels></tabbox>info0001idQueryViewModel类:private Tabbox tb;public Tabbox getTb() { return tb; } public void setTb(Tabbox tb) { this.tb = tb; }@Command@NotifyChange("*")public void Query(){ String keyword = this.infoDO.getId(); this.infoDO.setId(keyword); Sessions.getCurrent().setAttribute("infoDOSession", this.infoDO);//刷新組件,这边要让得到的组件刷新,我这里实现不了,这部分需要你帮忙下,多谢//Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");//这里打印出的tbx是:<Tabbox fUIQ40#tb>//System.out.println(tb+"******");//这里得到的组件是null} 你试试这句看看页面刷新了没?Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");Tab tt = (Tab) tbx.getFirstChild().getFirstChild();tt.setLabel("测试测试"); 你这只会另tab的标题更改了,但是里面include进来的window还是没刷新 我终于明白了,你是想把<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>这里的页面更新是吧?这个我还没做过,你试试(Window)self.getFellow("win")获得你include页面的win对象,如果能获得这个对象,就好办了。 我本意是想让整個tabbox单独更新,这样底下include的兩個window资料就能更新显示了。就算能得到win的对象,组件也没更新的方法吧 Thanks!问题解决了,就像你说的,获得win对象Include test01Inc = (Include) Path.getComponent("/win/test01win");test01Inc.invalidate(); CKeditor与Struts2结合 在servlet里怎么得到jsp页面过来的url 文件上传 怎样对HASH表进行多项数据的删除? 来不及了,帮忙完成JSP网站设计的几个功能,散分100 一个很莫名其妙的问题! 各位大哥过来看看~真的不知道为什么~~~ 随机函数如何用! 请问只装有JBUILDER8能否进行J2EE的开发? 程序员会累死的! js实现滚动加载商品列表,点击商品列表查看某一个商品后返回到原来商品列表位置怎么实现? 【删除cookie问题】无法删除cookie 如何用htmlparser获取网页上下拉框的选中值?
<tabbox id="tb" height="600px">
<tabs id="tabs">
<tab id="test01" label="資訊"/>
<tab id="test02" label="test"/>
</tabs>
<tabpanels>
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
<tabpanel><include src="/mvc/test0202Info/test02Info.zul"/></tabpanel>
</tabpanels>
</tabbox>目前在Query方法里我把整个页面跳转回本页面,两个include进来的window才有值,我想实现不要跳转本页面,只刷新这个tabbox组件,有没有办法实现,各位帮帮忙啊
在你的点击按钮事件中:
//获得tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
//对tabbox进行操作
后台对象操作,均可在页面中体现出。
我这里用的是apply
<window id="payApplyPlanMgrWin" width="100%"
border="0" position="center,top" height="100%" apply="${testMgrController}">
<Tabbox id="yourtabbox">
</Tabbox>
<toolbarbutton label="测试" onClick="controller.myTest(self)"></toolbarbutton>
在你的TestMgrController类中,定义yourtabbox对象
然后在你的按钮单击事件myTest中就可以操作yourtabbox了,
yourtabbox应该有很多属性的,如:
//获得子对象集合
List<org.zkoss.zk.ui.Component> list = yourtabbox.getChildren();
//设置式样
yourtabbox.setStyle等等。
直接对yourtabbox这个对象操作即可。
你对后台对象的操作,都可以体现到页面上。感觉ZK做一些ERP类的应用还行,做网站类的就不行了,性能不好,封装的太多了。
我现在手头上没有环境,只能凭记忆告诉你。
tabbox可能也有点击的事件,不确定,
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
然后对tb操作即可。
还不明白吗??
tb.setStyle("");
private Tabbox tbx;再添加getset方法。
tbx和你ZUL文件中Tabbox的ID一致即可。
tbx就是你的Tabbox对象,
操作完执行下:tbx.renderAll();
<window id="payApplyPlanMgrWin" width="100%"
border="0" position="center,top" height="100%" apply="${testMgrController}">这个绑定没成功。
zul:
<window id="win" title="for info query" width="100%" border="normal"
apply="org.zkoss.bind.BindComposer"
viewModel="@id('vm') @init('com.xpx.mvc.info0001idquery.info0001idQueryViewModel')">
<grid>
<rows>
<row>
<div sclass="field-title">关键字</div>
<div>
<textbox value="@bind(vm.infoDO.id)" maxlength="50"/>
</div>
</row>
</rows>
</grid>
<button label="查詢" onClick="@command('Query')"/>
<tabbox id="tb" height="600px">
<tabs id="tabs">
<tab id="test01" label="資訊"/>
<tab id="test02" label="test02"/>
</tabs>
<tabpanels>
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
<tabpanel><include src="/mvc/test02Info/test02Info.zul"/></tabpanel>
</tabpanels>
</tabbox>info0001idQueryViewModel类:
private Tabbox tb;
public Tabbox getTb() {
return tb;
}
public void setTb(Tabbox tb) {
this.tb = tb;
}
@Command
@NotifyChange("*")
public void Query(){
String keyword = this.infoDO.getId();
this.infoDO.setId(keyword);
Sessions.getCurrent().setAttribute("infoDOSession", this.infoDO);
//刷新組件,这边要让得到的组件刷新,我这里实现不了,这部分需要你帮忙下,多谢
//Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");//这里打印出的tbx是:<Tabbox fUIQ40#tb>
//System.out.println(tb+"******");//这里得到的组件是null
}
Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
tt.setLabel("测试测试");
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
这里的页面更新是吧?
这个我还没做过,
你试试(Window)self.getFellow("win")
获得你include页面的win对象,如果能获得这个对象,就好办了。
Include test01Inc = (Include) Path.getComponent("/win/test01win");
test01Inc.invalidate();