我正在开发ZK应用程序,它包含很少的角色。 对于角色“Guest”,我必须以只读模式创建所有组件。 那么如何在ZK应用程序中以只读模式创建容器(Window Div Layout)?
答案 0 :(得分:2)
是的,你也可以在MVVM中这样做。
所以让我们从头开始 您需要像the answer you reffering中那样连接一些组件:
@Wire("disable")
private List<Disable> allToDisable;
private boolean disable;
第二件事是,实现AfterCompose禁用和Init检查状态
在普通的MVVM中,您几乎不需要使用@AfterCompose
,但是当您需要连接这样的解决方案时,您将需要它。
@Init
public void init() {
disable = checkForGuest();
}
/**
* This method will launch when all components are created.
* @param view to wire the components
*/
@AfterCompose
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {
Selectors.wireComponents(view, this, false); // after this your private fields are wired.
disableAll(disable);
}
private void disableAll(boolean disableStatus){
for(Disable d : allToDisable) {
d.setDisabled(disableStatus);
}
}
您需要知道的是,首先触发@Init,然后触发AfterCompose。
那是因为数据绑定发生在@AfterCompose
之后。
您可以为disable
和zul添加一个getter:
<checkbox disabled="@load(yourValue or vm.disabled)"/>
有了这个,如果2中的1个为真,则始终禁用该复选框。
下班回家的时候,如果没有下降的解决办法,我不能让这样的事情发生 经过一夜安眠后,我找到了适合您的解决方案。
@AfterCompose
public void afterCompose(@SelectorParam("*") Collection<Component> allToDisable, @ContextParam(ContextType.BINDER)Binder binder) {
for(Component comp : allToDisable) {
if (comp instanceof Disable) {
((Disable)comp).setDisabled(disable);
binder.removeBindings(comp, "disabled");
}
}
}
**解释:**
虽然昨天我没有测试@Wire("disable")
是否有效,但我没有在ZK Fiddle工作。
首先,我想摆脱@Wire
所以我们使用@SelectorParam
来做同样的事情,因此我们不需要调用Selectors
。
我使用@Wire
或@SelectorParam
遇到同样的问题,我从未在列表中找到任何组件
所以现在,我们只是获取视图中的每个组件并检查它是否是Disable
接口的实例,女巫实际上是相同的,这样你甚至可以说不是按钮。
然后第二件事就是删除该Component的属性disabled
的绑定
您可以通过使用Binder
注释从上下文中询问@ContextParam
来执行此操作
最后,我们通过binder.removeBindings(Component, String);
删除绑定
注意,不要删除与binder.removeBindings(Component);
的完整绑定,因为在那一刻,你对值的绑定也消失了。
You can check it out in this fiddle(我通过检查Textbox
排除了按钮,因此您仍然可以按下按钮)
答案 1 :(得分:1)
容器不是设置启用/禁用属性的正确位置。它是一个被动的&#34;包含各种其他组件的元素。
要启用/禁用输入,您必须直接在输入组件上设置属性,例如textbox
,combobox
,....它们通常具有disabled
属性,如果客户端处于只读模式,则必须将其设置为true
。
使用MVVM时,您可以通过将所有组件的disabled属性绑定到同一视图模型属性来快捷方式:
<zk>
<window title="Enable/Disable" border="normal" width="600px"
apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('pkg$.TestVM')" >
<hbox>
<vbox>
<checkbox label='readonly' checked='@bind(vm.readonly)' />
</vbox>
<div>
<textbox value='test' disabled='@bind(vm.readonly)' />
<checkbox label='test' disabled='@bind(vm.readonly)' />
</div>
</hbox>
</window>
</zk>
Here你可以找到一个有用的例子。