好的,所以我已经在这方面花费了太多时间,但这真的让我很烦!所以,我有一个页面上有一堆标签。为了使事情易于管理,我想将这些选项卡中的每一个都变成具有自己的 ViewModel 的自己的 .zul 页面。EventQueue
为了将主要对象(锦标赛对象)从主页传递到所有辅助页面,我实现了一个。
问题是,每当触发事件并更新 Tournament 对象时,即使在 ViewModel 中发生更改,页面也不会刷新其数据。我尝试添加@NotifyChange
注释但没有成功。在调试时,我已经消除了额外的 .zul。请参阅下面的代码。
锦标赛Tab.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() 调用中设置了一个断点,并验证了唯一被调用的时间是页面首次加载时。
请帮忙!!!我知道通常这些事情只是我忽略的一些愚蠢的事情。请证明我的愚蠢!:)