ZK技术,单个组件刷新问题

时间:2020-12-08 19:44:14
有没有懂ZK技术的,帮忙解决一下吧,等等等。。。。
我现在要实现一个查询,是这样的:查询条件输入后点击按钮,查询的结果用tabbox显示,tabbox里include了两个window,目前我是点击按钮之后整个页面会刷新了一次,我想实现点击按钮之后不要整个window刷新,想要单个的tabbox刷新一次,请问怎么实现??各位高手帮帮忙

34 个解决方案

#1


有没有人懂的,帮我一下

#2


自己顶下,哪个高手帮帮忙啊

#3


代码贴出来啊

#4


用ajax轮询吧

#5


引用 4 楼 zhangchao19890805 的回复:
用ajax轮询吧
怎么轮询,不懂啊

#6


<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组件,有没有办法实现,各位帮帮忙啊

#7


ZK后台你可以直接操作tabbox的。
在你的点击按钮事件中:
//获得tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
//对tabbox进行操作

#8


ZK是基于AJAX的,所有的操作都可以异步刷新。
后台对象操作,均可在页面中体现出。

#9


引用 7 楼 aiqinbird 的回复:
ZK后台你可以直接操作tabbox的。
在你的点击按钮事件中:
//获得tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
//对tabbox进行操作

就是卡在對tabbox刷新的操作上,請問應該怎麼写,Thanks!

#10


引用 8 楼 aiqinbird 的回复:
ZK是基于AJAX的,所有的操作都可以异步刷新。
后台对象操作,均可在页面中体现出。
能不能给我例子,这块的刚接触,很多都不懂

#11


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这个对象操作即可。

#12


总的来说就一句话,ZK页面的对象和你后台对象可以一一对应,
你对后台对象的操作,都可以体现到页面上。

感觉ZK做一些ERP类的应用还行,做网站类的就不行了,性能不好,封装的太多了。

#13


引用 11 楼 aiqinbird 的回复:
ZK是我几个月前做的,现在大致看代码告诉你吧:
我这里用的是apply
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">
<Tabbox id="yourtabbox">
</Tabbox>
……
能告诉我刷新这个组件的操作怎么写吗,我网上查了,用tabbox.invalidate();但是没反应

#14


你可以用个按钮点击事件来刷新tabbox啊,
我现在手头上没有环境,只能凭记忆告诉你。
tabbox可能也有点击的事件,不确定,

#15


引用 14 楼 aiqinbird 的回复:
你可以用个按钮点击事件来刷新tabbox啊,
我现在手头上没有环境,只能凭记忆告诉你。
tabbox可能也有点击的事件,不确定,
跟你说下我的问题吧,我现在的问题就是想在按钮点击事件中刷新这个tabbox,但不知道怎么来刷新它,也没找到刷新这个组件的方法

#16


这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
然后对tb操作即可。
还不明白吗??

#17


你可以先试试更改下它的式样,你就知道了。
tb.setStyle("");

#18


引用 16 楼 aiqinbird 的回复:
这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("……
你这边的self是从哪里得到的

#19


引用 16 楼 aiqinbird 的回复:
这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("……
我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了

#20


引用 17 楼 aiqinbird 的回复:
你可以先试试更改下它的式样,你就知道了。
tb.setStyle("");
可是,你还是没有说怎么刷新这个组件,我就是卡在这里啊

#21


TO:我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了 

你要不在你的controller中定义
private Tabbox tbx;再添加getset方法。
tbx和你ZUL文件中Tabbox的ID一致即可。
tbx就是你的Tabbox对象,
操作完执行下:tbx.renderAll();

#22


引用 21 楼 aiqinbird 的回复:
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()这个方法

#23


说明你
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">

这个绑定没成功。

#24


引用 23 楼 aiqinbird 的回复:
说明你
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">

这个绑定没成功。
这个是绑定成功的,我其他功能都有走到后台

#25


是不是你的按钮和你的tabbox在不同的window里?

#26


引用 25 楼 aiqinbird 的回复:
是不是你的按钮和你的tabbox在不同的window里?
都在同一個window里的

#27


贴代码吧,把ZUL和类都贴出来

#28


引用 27 楼 aiqinbird 的回复:
贴代码吧,把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
}

#29


你试试这句看看页面刷新了没?
Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
tt.setLabel("测试测试");

#30


引用 29 楼 aiqinbird 的回复:
你试试这句看看页面刷新了没?
Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
tt.setLabel("测试测试");
你这只会另tab的标题更改了,但是里面include进来的window还是没刷新

#31


我终于明白了,你是想把
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
这里的页面更新是吧?
这个我还没做过,
你试试(Window)self.getFellow("win")
获得你include页面的win对象,如果能获得这个对象,就好办了。

#32


引用 31 楼 aiqinbird 的回复:
我终于明白了,你是想把
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
这里的页面更新是吧?
这个我还没做过,
你试试(Window)self.getFellow("win")
获得你include页面的win对象,如果能获得这个对象,就好办了。
我本意是想让整個tabbox单独更新,这样底下include的兩個window资料就能更新显示了。就算能得到win的对象,组件也没更新的方法吧

#33


Thanks!问题解决了,就像你说的,获得win对象
Include test01Inc = (Include) Path.getComponent("/win/test01win");
test01Inc.invalidate();

#34


引用 33 楼 xvvvx 的回复:
Thanks!问题解决了,就像你说的,获得win对象
Include test01Inc = (Include) Path.getComponent("/win/test01win");
test01Inc.invalidate();

多谢!!!!!!!!

#1


有没有人懂的,帮我一下

#2


自己顶下,哪个高手帮帮忙啊

#3


代码贴出来啊

#4


用ajax轮询吧

#5


引用 4 楼 zhangchao19890805 的回复:
用ajax轮询吧
怎么轮询,不懂啊

#6


<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组件,有没有办法实现,各位帮帮忙啊

#7


ZK后台你可以直接操作tabbox的。
在你的点击按钮事件中:
//获得tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
//对tabbox进行操作

#8


ZK是基于AJAX的,所有的操作都可以异步刷新。
后台对象操作,均可在页面中体现出。

#9


引用 7 楼 aiqinbird 的回复:
ZK后台你可以直接操作tabbox的。
在你的点击按钮事件中:
//获得tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
//对tabbox进行操作

就是卡在對tabbox刷新的操作上,請問應該怎麼写,Thanks!

#10


引用 8 楼 aiqinbird 的回复:
ZK是基于AJAX的,所有的操作都可以异步刷新。
后台对象操作,均可在页面中体现出。
能不能给我例子,这块的刚接触,很多都不懂

#11


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这个对象操作即可。

#12


总的来说就一句话,ZK页面的对象和你后台对象可以一一对应,
你对后台对象的操作,都可以体现到页面上。

感觉ZK做一些ERP类的应用还行,做网站类的就不行了,性能不好,封装的太多了。

#13


引用 11 楼 aiqinbird 的回复:
ZK是我几个月前做的,现在大致看代码告诉你吧:
我这里用的是apply
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">
<Tabbox id="yourtabbox">
</Tabbox>
……
能告诉我刷新这个组件的操作怎么写吗,我网上查了,用tabbox.invalidate();但是没反应

#14


你可以用个按钮点击事件来刷新tabbox啊,
我现在手头上没有环境,只能凭记忆告诉你。
tabbox可能也有点击的事件,不确定,

#15


引用 14 楼 aiqinbird 的回复:
你可以用个按钮点击事件来刷新tabbox啊,
我现在手头上没有环境,只能凭记忆告诉你。
tabbox可能也有点击的事件,不确定,
跟你说下我的问题吧,我现在的问题就是想在按钮点击事件中刷新这个tabbox,但不知道怎么来刷新它,也没找到刷新这个组件的方法

#16


这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("tabbox");
然后对tb操作即可。
还不明白吗??

#17


你可以先试试更改下它的式样,你就知道了。
tb.setStyle("");

#18


引用 16 楼 aiqinbird 的回复:
这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("……
你这边的self是从哪里得到的

#19


引用 16 楼 aiqinbird 的回复:
这个是ZUL中的按钮+按钮的单击事件
<button id="refreshButton" label="刷新" width="80px" onClick="controller.refresh()" />
你的controller中定义refresh()方法。
在refresh()方法中:
//获得你的tabbox对象
Tabbox tb = self.getFellowIfAny("……
我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了

#20


引用 17 楼 aiqinbird 的回复:
你可以先试试更改下它的式样,你就知道了。
tb.setStyle("");
可是,你还是没有说怎么刷新这个组件,我就是卡在这里啊

#21


TO:我是这样获取组件的Tabbox tbx = (Tabbox)Path.getComponent("/win/tabbox");是不是错了 

你要不在你的controller中定义
private Tabbox tbx;再添加getset方法。
tbx和你ZUL文件中Tabbox的ID一致即可。
tbx就是你的Tabbox对象,
操作完执行下:tbx.renderAll();

#22


引用 21 楼 aiqinbird 的回复:
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()这个方法

#23


说明你
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">

这个绑定没成功。

#24


引用 23 楼 aiqinbird 的回复:
说明你
<window id="payApplyPlanMgrWin" width="100%" 
border="0" position="center,top" height="100%" apply="${testMgrController}">

这个绑定没成功。
这个是绑定成功的,我其他功能都有走到后台

#25


是不是你的按钮和你的tabbox在不同的window里?

#26


引用 25 楼 aiqinbird 的回复:
是不是你的按钮和你的tabbox在不同的window里?
都在同一個window里的

#27


贴代码吧,把ZUL和类都贴出来

#28


引用 27 楼 aiqinbird 的回复:
贴代码吧,把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
}

#29


你试试这句看看页面刷新了没?
Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
tt.setLabel("测试测试");

#30


引用 29 楼 aiqinbird 的回复:
你试试这句看看页面刷新了没?
Tabbox tbx = (Tabbox)Path.getComponent("/win/tb");
Tab tt = (Tab) tbx.getFirstChild().getFirstChild();
tt.setLabel("测试测试");
你这只会另tab的标题更改了,但是里面include进来的window还是没刷新

#31


我终于明白了,你是想把
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
这里的页面更新是吧?
这个我还没做过,
你试试(Window)self.getFellow("win")
获得你include页面的win对象,如果能获得这个对象,就好办了。

#32


引用 31 楼 aiqinbird 的回复:
我终于明白了,你是想把
<tabpanel><include src="/mvc/test01Info/test01Info.zul"/></tabpanel>
这里的页面更新是吧?
这个我还没做过,
你试试(Window)self.getFellow("win")
获得你include页面的win对象,如果能获得这个对象,就好办了。
我本意是想让整個tabbox单独更新,这样底下include的兩個window资料就能更新显示了。就算能得到win的对象,组件也没更新的方法吧

#33


Thanks!问题解决了,就像你说的,获得win对象
Include test01Inc = (Include) Path.getComponent("/win/test01win");
test01Inc.invalidate();

#34


引用 33 楼 xvvvx 的回复:
Thanks!问题解决了,就像你说的,获得win对象
Include test01Inc = (Include) Path.getComponent("/win/test01win");
test01Inc.invalidate();

多谢!!!!!!!!