在ZK中,从其他ViewModel更改组件的属性

时间:2015-01-14 07:27:19

标签: java mvvm zk zul

我在zul文件中有一个使用ViewModel的按钮。我需要禁用/启用此按钮,具体取决于使用不同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是第二个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可以有多个实例,但是相关的实例可以通过一些公共数据成员(在#include中传递为#34; some参数&#34;在include组件中)来识别在ViewModel中。 这在ZK或任何有助于实现这一目标的方法中是否可行?

1 个答案:

答案 0 :(得分:3)

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

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

您不需要,如果zul2曾经使用过没有include标记,则其中不包含视图模型,因此无法正常工作。

我将在此向您发送一个示例以及指向the fiddle with this code的链接。

第一个解决方案:

Index.zul

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

IncludePage.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";
    }
}

第二个解决方案:

Read this documentation.

这对你意味着什么:

  1. 给你的包含一个id(女巫作为一个窗口在文档中做出反应)。
  2. 将ID提供给您的组件。
  3. 如果您的组件包含第二个zul中的接口Idspace,那么如果您的组件存在于树中,则需要将它们标记为。
  4. 甲。如果之间没有Path.getComponent("/zul2/minecomponent");组件,则IdSpace
  5. B中。 Path.getComponent("/zul2/IdOfIdSpaceComponent/minecomponent");如果之间有IdSpace个组件。
  6. 如果我可以发表一个评论:

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

    编辑:

    因为您仍然无法获得标签,所以我也使用解决方案2更新了解决方案1中的示例 如您所见,我可以从标签中询问包含的值 New fiddle can be found here.