2

我有一个包含两个不同视图模型的页面:

<?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">

我可以将第二个视图模型合并到第一个视图模型中,但这不是很方便!我也对其他允许我采用模块化方法的解决方案持开放态度。

我的 ZK 版本是 6.0.1

4

2 回答 2

0

您无法访问外部组件的原因是您的作曲家,即 BindComposer,您对 Main zul 和 Included zul 具有相同的作曲家。您需要从外部 ZUL 访问 Included Listbox。所以删除 Include ZUL 的 Composer,给窗口一个 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 中访问时,将变量声明为 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

于 2012-05-30T06:04:34.260 回答
0

它实际上是(曾经)ZK 中的一个错误,已在未来版本中修复。

于 2012-06-10T22:29:26.190 回答