2013-08-22 43 views
0

好的,所以我已經在這方面花了太多時間,但它真的讓我感到困擾!所以,我有一個頁面上有一堆標籤。爲了讓事情易於管理,我希望將這些標籤中的每一個都帶到他們自己的ViewModel的.zul頁面中。爲了將主對象(錦標賽對象)從主頁面傳遞到所有支持頁面,我已經實現了EventQueueZK - EventQueue可以工作,但數據不會令人耳目一新

問題是,無論何時觸發事件並更新錦標賽對象,即使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

來吧StackOverflow!你幫助其他人! ;) – Lance

+2

@NotifyChange語法看起來不對。它應該像'@NotifyChange(「錦標賽」)或'@NotifyChange({「錦標賽」})' –

+0

請參閱...我告訴過你這是愚蠢的!謝謝,尤金!堆棧溢出岩石。 :) – Lance

回答

0

我想你需要手動張貼通知,你可以嘗試這樣的:

public void onEvent(Event event) throws Exception { 
    setTournament((Tournament) event.getData()); 
    BindUtils.postNotifyChange(null, null, BeltClassViewModel.this, "tournament"); 
} 
0

尤金髮現了這個問題。一個簡單的錯誤。當它應該是@NotifyChange({"tournament"})時,我有@NotifyChange("{tournament}")。謝謝,尤金和堆棧溢出!

相關問題