2012-05-29 50 views
2

我有兩個不同的視圖模型的頁面:如何將數據綁定到子View模型?

<?page title="My page" contentType="text/html;charset=UTF-8"?> 
<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vm') @init('com.mycompany.FirstViewModel')"> 
<!-- A lot of unimportant stuff --> 
<tabbox> 
    <tabs> 
     <tab label="Tab1" ></tab> 
        <!-- Other unimportant tabs --> 
    </tabs> 
    <tabpanels> 
     <tabpanel> 
     <include src="inc/other.zul" p="@ref(vm.selected)" pid="@ref(vm.selected.id)" ></include> 
     </tabpanel> 
    </tabpanels> 
</tabbox> 
</div> 

而且包括是:

<window> 
    <label id="sid" value="@load(pid)" /> 
    <div apply="org.zkoss.bind.BindComposer" 
     viewModel="@id('vms') @init('com.mycompany.SecondViewModel')"> 
     <listbox model="@id('vars') @load(p.someList)" 
      selectedItem="@bind(vms.selected)" 
      emptyMessage="No data in list"> 
        <!-- Template and stuff --> 
     </listbox> 
     <label id="sid1" value="@load(pid)" /> 
    </div> 
</window> 

的問題是,一旦我定義第二視圖模型,所有的外部引用是不可訪問:我有第一個標籤的值,但我沒有列表框或第二個標籤的值。有沒有辦法做到這一點?我嘗試沒有成功做到這一點:

<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vms') @init('com.mycompany.SecondViewModel')" list="@ref(p.someList)"> 
<listbox model="@id('vars') @load(list)" 
    selectedItem="@bind(vms.selected)" 
    emptyMessage="No data in list"> 

我能在第一個合併的第二視圖模型,但是這不會是很方便!我也接受其他解決方案,這讓我可以採用模塊化方法。

我ZK版本是6.0.1

+0

查看http://books.zkoss.org/wiki/ZK_Component_Reference/Essential_Components/Include#Pass_Values_to_the_Included_Page_2傳遞參數非常靜態,並且僅將外觀放入requestScope中,以便在外部頁面的渲染階段進行。當用戶點擊標籤面板後,原始渲染中使用的參數不會被重新評估。將內部項目綁定到空的viewmodel。將全局命令放在tabbox上,選擇內部和外部視圖模型可以偵聽的內容,並通過desktopScope將選定日期傳遞給內部視圖模型? – simbo1905

+0

這是指MVC,我使用MVVM。另外,我可以從include內部訪問參數,它是不能再訪問它的子視圖模型。 – Kjir

+0

包含的內容與mvc,mvp或mvvm無關。關鍵是在事件被解僱時事情不會被重新評估。 – simbo1905

回答

0

這是(是)實際上是在ZK,這已被固定爲未來版本bug

0

的原因而無法訪問外部組件是你的作曲家即BindComposer你有相同的作曲家爲主營ZUL以及所包含的ZUL。您需要從外部ZUL訪問包含的列表框。 所以去除包括ZUL的作曲家,給一個ID窗口中,您有兩個空間所有者訪問內部列表框現在

<?page title="My page" contentType="text/html;charset=UTF-8"?> 
<div apply="org.zkoss.bind.BindComposer" 
viewModel="@id('vm') @init('com.mycompany.FirstViewModel')"> 
<!-- A lot of unimportant stuff --> 
<tabbox> 
    <tabs> 
     <tab label="Tab1" ></tab> 
        <!-- Other unimportant tabs --> 
    </tabs> 
    <tabpanels> 
     <tabpanel> 
     <include id="include" src="inc/other.zul" p="@ref(vm.selected)" pid="@ref(vm.selected.id)" ></include> 
     </tabpanel> 
    </tabpanels> 
</tabbox> 
</div> 


<window id="win"> 
    <label id="sid" value="@load(pid)" /> 
    <div 
     viewModel="@id('vms') @init('com.mycompany.SecondViewModel')"> 
     <listbox id="listbox2" model="@id('vars') @load(p.someList)" 
      selectedItem="@bind(vms.selected)" 
      emptyMessage="No data in list"> 
        <!-- Template and stuff --> 
     </listbox> 
     <label id="sid1" value="@load(pid)" /> 
    </div> 
</window> 

,而在你的BindComposer聲明變量訪問爲公衆:

Listbox include$win$listbox2; 

您doAfterCompose()加入這一行

Sysout("You can access your inner Listbox and it is:"+include$win$listbox2); 

現在你看,你不會得到你的列表框空!

鏈接:http://books.zkoss.org/wiki/ZK_Developer's_Reference/UI_Composing/ID_Space

+0

我不確定我是否明白,如果我從包含的文件中移除Composer,vms'現在定義爲null,所以無論何時點擊列表中的項目,我都會得到一個異常。所以基本上我沒有第二個ViewModel了...... – Kjir

+0

@Kjir我編輯了我的答案希望它有幫助〜 – 2012-05-30 14:57:50

+0

糾正我,如果我錯了:你刪除了'apply =「org.zkoss.bind.BindComposer」 '並添加了'id =「win」';我試過,並且vms不包含ViewModel ...另外我沒有doAfterCompose(),這是MVVM,不是MVC ... – Kjir

相關問題