ZK - EventQueue工作,但数据不令人耳目一新

时间:2013-08-22 14:04:55

标签: events data-binding zk

好的,所以我已经花了太多时间在这上面,但这真的让我烦恼!所以,我有一个页面上有一堆标签。为了使事情易于管理,我想将每个标签变成他们自己的.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()调用中设置了一个断点,并验证了在第一次加载页面时调用的唯一时间。

请帮助!!! 我知道通常这些事情只是我忽略的愚蠢行为。请证明我的愚蠢! :)

2 个答案:

答案 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!