我有一个包含两个不同视图模型的页面:
<?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>
问题是,一旦我定义了第二个viewModel,所有外部引用都是不可访问的:我有第一个标签的值,但我没有列表框或第二个标签的值。有没有办法做到这一点?我试过没有成功:
<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">
我可以在第一个中合并第二个View Model,但那不是很方便!我也对其他允许我采用模块化方法的解决方案持开放态度。
我的ZK版本是6.0.1
答案 0 :(得分:0)
你无法访问外部组件的原因是你的作曲家,即BindComposer你有同样的作曲家为主zul和包含zul。您需要从外部ZUL访问Included Listbox。 因此,删除包含ZUL的Composer,为窗口提供一个ID,您有两个Space Owners访问内部列表框
<?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声明变量中访问public:
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
答案 1 :(得分:0)
它实际上是ZK中的bug,已针对未来版本修复。