我想将Label的值从控制器类传递到zul页面。但是,控制器类中Iam设置的标签值未显示在UI中。请帮助我解决这个问题。下面是我的代码。
zul页面:
<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>
Controller类: sampleController.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;
}
}
答案 0 :(得分:0)
您必须告诉zk(即,用于同步视图模型和组件的活页夹)值已更改。 Have a look @NotifyChange
。
首先在设置器上添加注释:
@NotifyChange("displayLabelName")
public void setDisplayLabelName(String displayLabelName) {
this.displayLabelName = displayLabelName;
}
然后使用设置器来操纵值:
setDisplayLabelName("First Name");
现在,设置者将告诉zk值已更改,zk会将其映射到标签。
或者,您也可以手动进行通知(也在链接中提及):
BindUtils.postNotifyChange(null, null, this, "displayLabelName");
中
zk中的MVC的工作原理非常不同:您不控制值,但控制组件本身。您可以通过将它们"wiring"放入Composer中来进行操作,然后对它们进行操作:
@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);
}
答案 1 :(得分:0)
您也可以在SELECT
x.columnPrimaryKey,
x.column1,
x.column2,
x.column3
FROM tableName AS x INNER JOIN (
SELECT
MIN( column2 ) AS column2,
column3
FROM tableName
GROUP BY column3
) AS y ON x.column2 = y.column2 AND x.column3 = y.column3;
中使用doBeforeCompose
在作曲家当前组件的组件范围内填充值。然后,您可以通过zk表达式self.setAttribute("name", "firstname");
在zul中访问它,但是此解决方案只是一种方法。但这会使视图与控制器分离,并且与性能视图相比要好得多,因为它在RAM中不包含绑定等。如果您需要仅查看方式,则应首选此方式。
否则,Malte的MVVM答案是正确的方法,因为它得到了更好的支持,并且是做事的真正“ ZK方式”。但是有时您会停留在旧版本中,那么这可能会有所帮助。