我在使用 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 是第二个 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 中的一些公共数据成员(在包含组件中作为"some参数"传递)对象来识别。这在ZK或任何可以帮助实现这一目标的方法中是否可能?
我将向您展示ZK的一些功能。
如果您的 zul2 在 zul 中有一个视图模型,那么不要称之为vm
!
原因是实际上您的 zul2 可以访问 zul 1 的虚拟机。
因此,您可以在Zul1VM中编写Zul2VM的整个代码。
您不需要这样做,如果 zul2 曾经在没有包含标记的情况下使用,则其中不包含视图模型,因此它将无法正常工作。
我将在这里发布一个示例,以及指向此代码的小提琴的链接。
第一个解决方案:
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>
测试虚拟机
.javapublic class TestVM {
String value = "Default";
public String getValue () {
return value;
}
@Command
@NotifyChange("value")
public void changeValue () {
value = "new value";
}
}
第二种解决方案:
阅读此文档。
这对你意味着什么:
- 给你的包含一个id(女巫在文档中的反应作为一个窗口)。
- 为您的组件提供 Id。
- 如果您有组件的内容,包括接口
Idspace
在第二个 zul 中,您需要将它们标识到组件的树中。 - 一个。
Path.getComponent("/zul2/minecomponent");
如果两者之间没有IdSpace
组件。 - 二.
Path.getComponent("/zul2/IdOfIdSpaceComponent/minecomponent");
两者之间是否有IdSpace
组件。
如果我可以说一句话:
使用MVVM 时不要使用 @AfterCompose
,这是 MVC 的注释。(我知道它在 MVVM 中有效)
正确的方法是使用@Init
注释。(你也可以说你的超类有一个初始化。
编辑:
由于您仍然无法获取标签,因此我使用解决方案 2 更新了解决方案 1 中的示例。
如您所见,我可以从标签中询问包含的值。
新的小提琴可以在这里找到。