关于刷新zul页面中的一些元素,我遇到了这个问题。我目前使用MVC与ZK,而不是MVVM。我已经使用了elementId.invalidate(),但该方法似乎不起作用。有人能帮助我如何在MVC ZK中做到这一点吗?
这是我的zul页面
<?xml version="1.0" encoding="UTF-8"?>
<zk xmlns="http://www.zkoss.org/2005/zul">
<window border="none" apply="com.dorne.got.ui.far.there.FooComposer">
<groupbox mold="3d" closable="false">
<caption
label="${labels.generate.foo.forward}" />
<grid fixedLayout="true">
<columns>
<column width="20%" />
<column width="80%" />
</columns>
<rows>
...
...
<row>
<div>
<label
value="${labels.foo.fr.Name}" />
</div>
<div>
<!-- constraint="/.+.+|/: Please enter a valid Name" -->
<textbox id="txtName" width="10%" />
<label id="lblErrorName"
style="color:red" />
</div>
</row>
</rows>
</grid>
<div align="center">
<separator />
<button id="btnSubmit"
label="${labels.common.button.generate}" />
<button id="btnClose"
label="${labels.common.button.cancel}" />
<separator />
</div>
</groupbox>
</window>
这是我的MVC zk作曲家
public class RefreshLabelNameComposer extends WindowComposer {
@Wire
private Label lblErrorName
@Override
public void doAfterCompose(Window comp) throws Exception {
//skip this code
}
public longProcess() {
//some long proccess
}
@Listen("onClick = #btnSubmit")
public void btnSubmitClick() {
lblErrorName.setValue("");
lblErrorName.invalidate();
longProccess();
}
}
假设在某个过程之后,lblErrorName值不为空。在我按下Submit按钮之后,就在长进程运行之前,lblErrorName不会将其值刷新为"。我希望在运行longProccess之前,lblErrorName被刷新为空字符串,这样用户在运行longProccess方法时就不会看到错误。我认为问题在于invalidate()方法如何与MVC ZK一起工作,但我不确定问题出在哪里。有人能帮忙修理吗?非常感谢
编辑:我正在使用ZK 7
编辑2:我已经尝试了
lblErrorName.setVisible(!lblErroName.isVisible());
lblErrorName.setValue("");
lblErrorName.setVisible(!lblErroName.isVisible());
但是,元素标签lblErrorName仍然不会刷新为空字符串
你陷入了一个陷阱,大多数人都有问题
这与MVC或MVVM无关,甚至invalidate()
也永远不会在您想要的时间工作
原因是只要你的方法在运行(长操作),你就不会给客户反馈
换句话说,反馈是在你的长时间操作完成后发送的
有几种方法可以实现这一点,但我更喜欢potix的Robert Wenzel创建的一个很棒的抽象解决方案
实现是一样的,只有@Command
中的内容才会在您的@Listen
中。
否则,如果你不想这样做,我建议你只需呼应一个事件
Echo事件意味着,您转到客户端,客户端将在收到响应后直接触发该事件
这是一个很好的解决方案,当你没有太多的长期行动,但很难看到接下来会发生什么。