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

标签 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是Second 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 中的一些公共(public)数据成员(在包含组件中作为“someparameter”传递)对象来识别相关实例。 这在 ZK 或任何可以帮助实现这一目标的方法中可能吗?

最佳答案

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

如果你的 zul2 在 zul 中有一个 View 模型,那么不要调用这个vm!
原因是实际上您的 zul2 可以访问 zul 1 的虚拟机。
因此,您实际上可以在 Zul1VM 中编写 Zul2VM 的整个代码。

你不需要这样做,如果 zul2 在没有 include 标签的情况下使用过一次,那么它就不会包含 viewmodel,所以它不会正常工作。

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

第一个解决方案:

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

第二种解决方案:

Read this documentation.

这对您意味着什么:

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

如果我可以说一句话:

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

编辑:

因为您仍然无法获取标签,所以我用解决方案 2 更新了解决方案 1 中的示例。
正如您所看到的,我可以从包含的标签中获取值。
New fiddle can be found here. .

关于java - 在ZK中,从其他ViewModel更改组件的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27937744/

相关文章:

data-binding - 按下回车键时数据未绑定(bind)

java - 如何从字符串参数设置ZK中的图像内容

Java 对象引用冗余

java - 如何从 TableList POI 中移除/删除表格

java - Eclipse RCP 中应用程序范围的资源位置在哪里?

javascript - 如何 mvvm 数据绑定(bind)剑道单选按钮值属性?

wpf - 状态栏不总是更新

java - 使用 zk 在 richlet 中包含 css 文件

java - 如何获取数据库表数据(oracle 11g)作为Json对象并在Android中显示该Json对象?

Java map.containsKey 不起作用