好的,所以我已经花了太多时间在这上面,但这真的让我烦恼!所以,我有一个页面上有一堆标签。为了使事情易于管理,我想将每个标签变成他们自己的.zul页面和他们自己的ViewModel。我已经实现了一个EventQueue
,以便将主要对象(Tournament对象)从主页传递到所有的页面。
问题是,每当事件被触发并且它更新Tournament对象时,即使ViewModel中的页面已经更改,页面也不会刷新其数据。我尝试添加@NotifyChange
注释但没有成功。在调试时,我已经删除了额外的.zul。请参阅下面的代码。
tournamentsTab.zul:
<tabpanel apply="org.zkoss.bind.BindComposer" viewModel="@id('bcvm') @init('com.cannon.tnt.trm.mvvm.BeltClassViewModel')">
<vlayout vflex="1">
<grid model="@load(bcvm.tournament.beltClasses)" emptyMessage="No belt ranks created yet." vflex="1">
<columns>
<column label="Name" align="center" width="200px"/>
<column label="Description" align="center"/>
<column label="Delete" align="center" width="120px"/>
</columns>
<template name="model">
<row>
<textbox value="@bind(each.name)" width="95%" onChanging="@command('setStateEditing')"/>
<textbox value="@bind(each.description)" width="95%"
onChanging="@command('setStateEditing')"/>
<button label="Delete" onClick=""/>
</row>
</template>
</grid>
</vlayout>
<!--<include src="beltClassPanel.zul"/>-->
</tabpanel>
BeltClassViewModel.java:
public class BeltClassViewModel {
private EventQueue eq;
private Tournament tournament;
@Init
public void init() {
eq = EventQueues.lookup("tournamentQueue");
eq.subscribe(new EventListener() {
public void onEvent(Event event) throws Exception {
setTournament((Tournament) event.getData());
}
});
}
public Tournament getTournament() {
return tournament;
}
@NotifyChange("{tournament}")
public void setTournament(Tournament selectedTournament) {
this.tournament = selectedTournament;
}
}
正如我所提到的,EventQueue
部分工作正常。该事件被触发,然后由调用者接收,该调用者在视图模型上设置锦标赛对象。问题是,引用的锦标赛对象没有在UI中更新。我在getTournament()调用中设置了一个断点,并验证了在第一次加载页面时调用的唯一时间。
请帮助!!! 我知道通常这些事情只是我忽略的愚蠢行为。请证明我的愚蠢! :)
答案 0 :(得分:0)
我想您需要手动发布通知,您可以尝试这样的事情:
public void onEvent(Event event) throws Exception {
setTournament((Tournament) event.getData());
BindUtils.postNotifyChange(null, null, BeltClassViewModel.this, "tournament");
}
答案 1 :(得分:0)
@NotifyChange("{tournament}")
时@NotifyChange({"tournament"})
。谢谢,Eugene和Stack Overflow!