Java 在ZK中,更改组件';来自其他ViewModel的属性

Java 在ZK中,更改组件';来自其他ViewModel的属性,java,mvvm,zk,zul,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

我在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和第二个zul可以有多个实例,但是相关的实例可以通过ViewModel中的一些公共数据成员(在include组件中作为“someparameter”传递)对象来识别。
这在ZK或任何有助于实现这一点的方法中都是可能的吗?

我将向您展示ZK的一些特性。

如果您的zul2在zul中有一个viewmodel,那么不要将其称为
vm

原因是您的zul2实际上已经访问了ZUL1的VM。
因此,您可以只在Zul1VM中编写整个Zul2VM代码。

您不需要这样做,而且如果zul2曾经在没有包含标记的情况下使用过,那么其中没有包含viewmodel,因此它将无法正常工作

我会在这里给你发一个例子和一个链接

第一个解决方案: 索引zul 第二种解决方案:

这对您意味着什么:

  • 为您的包含提供一个id(在文档中作为一个窗口)。
  • 为您的组件提供Id
  • 如果在第二个zul中包含接口
    Idspace
    ,那么您需要将它们标识为组件所在树中的组件
  • A.
    Path.getComponent(“/zul2/minecomponent”)如果两者之间没有
    IdSpace
    组件
  • B.
    Path.getComponent(“/zul2/IdOfIdSpaceComponent/minecomponent”)如果之间存在
    IdSpace
    组件
  • 请允许我说一句话:

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

    编辑: 因为您仍然无法获取标签,所以我将解决方案1中的示例也更新为解决方案2。
    如您所见,我可以从标签中取出包含的值。

    .

    vm1正在创建zul2吗?ZUL1正在创建zul2,它是一个选项卡面板。我正在编辑代码的第一部分,以显示它是如何包含的。第一个zul也作为选项卡包含在某个位置,一些参数被传递给它,并通过“@ExecutionArgParam(“参数名称”)在init函数中获取这些参数.对于第二个zul,我还在include语句中传递一些参数,这些参数在第二个vm的init中获取,这个参数对象成为第二个zul的模型。那么,我可以在同一个VM的init中为两个zul处理不同的ExecutionArgParam集吗?我是否必须在int Exec参数中设置一些标志来查找哪个zul调用了VM?这是正确的方法吗?@Harry执行参数是一个映射。2个不同的密钥名称是可能的。若密钥不存在,则只会得到一个空值。因此,您可以知道参数是否不为null。我无法使用选择器在VM中按id获取第二个zul的组件。WireComponents您使用解决方案1还是2?我使用的是第一个解决方案,其中两个zul都有相同的VM,我使用了您的示例,但是如果我在IncludePage.zul中给标签一些id,然后尝试在TestVM.java中访问它,那么zul标签对象的引用就具有null值。
     @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*/    
        }
    
    <window id="win" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('pkg$.TestVM')">
        <include src="includePage.zul"  />
    </window>
    
    <vbox>
        <label value="@load(vm.value)" />
        <button label="Update" onClick="@command('changeValue')" />
    </vbox>
    
    public class TestVM {
    
        String value = "Default";
    
        public String getValue () {
            return value;
        }
    
        @Command
        @NotifyChange("value")
        public void changeValue () {
            value = "new value";
        }
    }