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-способ" делать вещи. Но иногда вы застреваете в старых версиях, и тогда это может помочь.

В MVVM ViewModel

Вы должны сообщить zk (то есть связующему, которое синхронизирует вашу модель представления и компоненты), что значение изменилось. Посмотри@NotifyChange,

Сначала поместите аннотацию на ваш сеттер:

@NotifyChange("displayLabelName")
public void setDisplayLabelName(String displayLabelName) {
    this.displayLabelName = displayLabelName;
}

А затем используйте установщик для управления значением:

setDisplayLabelName("First Name");

Теперь установщик скажет zk, что значение было изменено, и zk сопоставит его с меткой.

В качестве альтернативы вы можете уведомить вручную (упомянуто также по ссылке):

BindUtils.postNotifyChange(null, null, this, "displayLabelName");

В MVC Composer

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);
}
Другие вопросы по тегам