zk-如何将标签值从控制器类传递到zk中的zul

时间:2018-08-13 11:58:54

标签: controller zk zul

我想将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;
    }
}

2 个答案:

答案 0 :(得分:0)

MVVM ViewModel

您必须告诉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");

MVC Composer

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方式”。但是有时您会停留在旧版本中,那么这可能会有所帮助。