我想将 Label 的值从控制器类传递到 zul 页面。但是 Iam 在控制器类中设置的标签值不会显示在 UI 中。请帮我解决这个问题。下面是我的代码。
祖尔页面 :
<zk>
<window title="sampleModal"
closable="true" position="center,center" id="calendarModal"
action="show: slideDown;hide: slideUp" width="75%" height="100%"
style="background-color: white;position: absolute;z-index: 1800;">
<div viewModel="@id('vm')" apply="com.eg.sample.zul.controller.sampleController">
<label id="label" value="@load(vm.displayLabelName)"></label>
</div>
</window>
</zk>
控制器类:样本控制器.java
package com.eg.sample.zul.controller.sampleController;
public class SampleController extends SelectorComposer<Component> {
private String displayLabelName;
@Override
public void doAfterCompose(Component comp) {
try {
super.doAfterCompose(comp);
this.displayLabelName = "First Name";
}
catch (Exception e) {
LOG.info(e);
}
}
public String getDisplayLabelName() {
return displayLabelName;
}
public void setDisplayLabelName(String displayLabelName) {
this.displayLabelName = displayLabelName;
}
}
在 MVVM 视图模型中
您必须告诉 zk(即同步视图模型和组件的绑定器(值已更改。看看@NotifyChange
.
首先在你的二传手上放一个注释:
@NotifyChange("displayLabelName")
public void setDisplayLabelName(String displayLabelName) {
this.displayLabelName = displayLabelName;
}
然后使用资源库操作值:
setDisplayLabelName("First Name");
现在,setter 将告诉 zk 该值已更改,zk 会将其映射到标签。
作为替代方法,您可以手动通知(在链接中也提到(:
BindUtils.postNotifyChange(null, null, this, "displayLabelName");
在 MVC 作曲家中
zk 中的 MVC 的工作方式非常不同:您不控制值,而是控制组件本身。您可以通过将它们"连接"到您的作曲器中来执行此操作,然后由作曲家操作它们:
@Wire
private Label label;
@Override
public void doAfterCompose(Component comp) {
try {
super.doAfterCompose(comp);
setDisplayName("First Name");
}
catch (Exception e) {
LOG.info(e);
}
}
public String getDisplayLabelName() {
return label.getValue();
}
public void setDisplayLabelName(String displayLabelName) {
label.setValue(displayLabelName);
}
您也可以使用self.setAttribute("name", "firstname");
来填充 composer 当前组件的组件范围内的值doBeforeCompose
。然后你可以通过 zk 表达式在 zul 中访问它<label id="label" value="${name}" />
但这个解决方案只是一种方式。但它会将视图与控制器分离,并且从性能视图分离要好得多,因为它在 RAM 中不保存绑定等。如果您需要仅查看方式,则应首选此方式。
否则,Malte 的 MVVM 答案是正确的方法,因为它得到了更好的支持,并且是真正的"ZK 方式"。但有时你会被困在旧版本中,然后这可能会有所帮助。