ZK如何以只读模式创建容器(Window Div Layout)?

时间:2015-12-09 09:57:05

标签: zk

我正在开发ZK应用程序,它包含很少的角色。 对于角色“Guest”,我必须以只读模式创建所有组件。 那么如何在ZK应用程序中以只读模式创建容器(Window Div Layout)?

2 个答案:

答案 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;包含各种其他组件的元素。

要启用/禁用输入,您必须直接在输入组件上设置属性,例如textboxcombobox,....它们通常具有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你可以找到一个有用的例子。