zk-Как передать значение метки из класса контроллера в zul в zk
Я хочу передать значение метки из класса контроллера на страницу zul. Но значение метки, которое Iam устанавливает в классе контроллера, не отображается в пользовательском интерфейсе. Пожалуйста, помогите мне решить это. Ниже мой код.
зул страница:
<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>
Класс контроллера: 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 ответа
Вы также можете сделать в doBeforeCompose
использовать self.setAttribute("name", "firstname");
заполнить значение в области видимости текущего компонента composer. Тогда вы можете получить к нему доступ в zul через выражения zk <label id="label" value="${name}" />
но это решение только один путь. Но он бы отделил представление от контроллера и намного лучше с точки зрения производительности, потому что он не содержит привязок и т. Д. В оперативной памяти. Если вам нужен только для просмотра путь, этот должен быть предпочтительным.
В противном случае ответ Malte на MVVM - правильный путь, потому что он намного лучше поддерживается и реальный "ZK-способ" делать вещи. Но иногда вы застреваете в старых версиях, и тогда это может помочь.
Вы должны сообщить zk (то есть связующему, которое синхронизирует вашу модель представления и компоненты), что значение изменилось. Посмотри@NotifyChange
,
Сначала поместите аннотацию на ваш сеттер:
@NotifyChange("displayLabelName")
public void setDisplayLabelName(String displayLabelName) {
this.displayLabelName = displayLabelName;
}
А затем используйте установщик для управления значением:
setDisplayLabelName("First Name");
Теперь установщик скажет zk, что значение было изменено, и zk сопоставит его с меткой.
В качестве альтернативы вы можете уведомить вручную (упомянуто также по ссылке):
BindUtils.postNotifyChange(null, null, this, "displayLabelName");
MVC в zk работает совсем иначе: вы управляете не значениями, а самими компонентами. Вы делаете это, "подключая" их к вашему 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);
}