2

我在使用 ViewModel 的 zul 文件中有一个按钮。我需要根据使用不同 ViewModel 的其他 zul 中的数据状态禁用/启用此按钮。第一个 ZUL 文件:

<window apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('First VM')" validationMessages="@id('vmsgs')">
<tabbox>
  <tabs>
     <tab label="Label Value" />
  </tabs>
  <tabpanels>
     <tabpanel>
       <include someparameter="${some_VM_model_object}" src="ZUL2"></include>
     </tabpanel>
  </tabpanels>
</tabbox>
<button label="My Button" onClick="" id="mybutton" visible="false" />
</window>

现在还有另一个 ZUL 文件,以及它对应的 VM(假设它的 VM 是 Second VM)第二个 VM:

 @AfterCompose
    public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
        /*In this aftercompose method I want to check some condition on the model of the        
        second zul file and depending on that I want to disable/enable the "My Button"
        button in the  first ZUL*/    
    }

第一个 zul 和第二个 zul 可以有多个实例,但相关的可以通过 ViewModel 中的一些公共数据成员(在包含组件中作为“某些参数”传递)对象来识别。这在 ZK 中是否可能或任何有助于实现这一目标的方法?

4

1 回答 1

3

我将向您展示 ZK 的一些很棒的功能。

如果您的 zul2 在 zul 中有一个视图模型,那么不要调用它vm
原因是实际上您的 zul2 可以访问 zul 1 的 VM。
因此您实际上可以在 Zul1VM 中编写 Zul2VM 的整个代码。

您不需要,如果 zul2 曾经在没有包含标签的情况下使用,则其中没有包含视图模型,因此它不能正常工作。

我将在此处发布一个示例以及指向带有此代码的小提琴的链接。

第一个解决方案:

索引.zul

<window id="win" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('pkg$.TestVM')">
    <include src="includePage.zul"  />
</window>

包含页面.zul

<vbox>
    <label value="@load(vm.value)" />
    <button label="Update" onClick="@command('changeValue')" />
</vbox>

TestVM.java

public class TestVM {

    String value = "Default";

    public String getValue () {
        return value;
    }

    @Command
    @NotifyChange("value")
    public void changeValue () {
        value = "new value";
    }
}

第二种解决方案:

阅读本文档。

这对你意味着什么:

  1. 为您的包含提供一个 ID(女巫在文档中作为窗口做出反应)。
  2. 为您的组件提供 ID。
  3. 如果您的组件包含Idspace第二个 zul 中的接口,您需要将它们标识到您的组件的树中是否存在。
  4. A.Path.getComponent("/zul2/minecomponent");如果之间没有IdSpace组件。
  5. B.之间Path.getComponent("/zul2/IdOfIdSpaceComponent/minecomponent");是否有IdSpace组件。

如果我可以说一句:

使用 MVVM 时不要使用@AfterCompose,这是 MVC 的注解。(我知道它在 MVVM 中有效)
正确的方法是使用@Init注释。(你也可以说你的超类有一个 init 。)

编辑:

因为您仍然无法获得标签,所以我用解决方案 2 更新了解决方案 1 中的示例。
如您所见,我可以从标签中询问包含的值。
可以在这里找到新的小提琴。.

于 2015-01-15T08:03:19.897 回答