0

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

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

4

2 回答 2

0

我想你需要手动发布通知,你可以尝试这样的事情:

public void onEvent(Event event) throws Exception {
    setTournament((Tournament) event.getData());
    BindUtils.postNotifyChange(null, null, BeltClassViewModel.this, "tournament");
}
于 2013-08-23T08:28:51.853 回答
0

尤金发现了问题。一个简单的错误。我有@NotifyChange("{tournament}")它应该是的时候@NotifyChange({"tournament"})。谢谢,尤金和堆栈溢出!

于 2013-08-23T12:04:44.973 回答