Получение выбранных значений ListBox по кнопке Click | ZK
Я очень новичок в фреймворке ZK и пытаюсь настроить несколько вещей и ударил один момент, который я не уверен, как этого добиться.
У меня есть предопределенный раздел, где мне нужно показать 2 выпадающих и кнопку, и мне нужно сохранить эти выпадающие значения при нажатии кнопки. Вот как это было определено в файле Spring
<bean id="mybean" parent="parentBean" class="WidgetRenderer">
<property name="detailRenderer">
<bean class="DetailsListRenderer" parent="abstractWidgetDetailRenderer"/>
</property>
</bean>
Вот mybean
используется для отображения основного раздела, и я добавляю свой раскрывающийся список, используя этот компонент, в то время как кнопка добавляется в detailRenderer
,
Кнопка Сохранить привязана к onClick
событие, но я не уверен, как я могу получить значения из моего пользовательского раскрывающегося списка? Я знаю о связывании тех Dropdown
с onClick
событие, но они должны быть в одном классе.
Может ли кто-нибудь предложить мне, как я могу получить значения этих выпадающих. Я создаю вниз с помощью следующего кода
Listbox listbox = new Listbox();
listbox.appendItem("item1", "item1");
listbox.appendItem("item2", "item2");
Это мой код кнопки в другом классе
protected void createUpdateStatusButton(Widget widget,Div container)
{
Button button = new Button(LabelUtils.getLabel(widget, buttonLabelName, new Object[0]));
button.setParent(container);
button.addEventListener("onClick", new EventListener()
{
public void onEvent(Event event)throws Exception
{
MyClass.this.handleSaveStatusEvent(widget, event);
}
});
}
2 ответа
Вы можете слушать onSelect
(Я предпочитаю использовать Events.ON_SELECT
вместо того, чтобы писать строки), что более конкретно, когда Listbox
изменения выбора.
В любом случае, ключ заключается в том, чтобы получить информацию, которую вы хотите от Event
перешел к вашему EventListener
вместо того, чтобы вернуться к вашему Listbox
сам. Основа Event
обычно несет полезную информацию о getTarget
а также getData
но используя более конкретные события (SelectEvent
в этом случае) даст вам доступ к более актуальной информации.
button.addEventListener(Events.ON_SELECT, new EventListener<SelectEvent<Listitem, MyDataObject>() {
public void onEvent(SelectEvent<Listitem, MyDataObject> event) {
// Now you can access the details of the selection event..
List<Listitem> selectedItems = event.getSelectedItems();
List<MyDataObject> selectedObjects = event.getSelectedObjects();
}
});
Вы можете узнать, какие события доступны для различных виджетов ZK, в их Справочной документации по компонентам.
Если я понимаю вопрос (я не думаю, что понял в моем предыдущем ответе), вы хотите собрать информацию со страницы (например: Listbox
состояние выбора), когда пользователь нажимает кнопку. Ваша проблема в том, что вы используете разнородные классы для создания страницы и поэтому не имеете доступа к различным ZK Component
s при нажатии кнопки.
(Игнорирование проблемы с несколькими классами в течение минуты)
С высокого уровня, в сообществе ZK есть два типа лагерей. Более новый подход MVVM предполагает, что представление должно выдвигать соответствующее состояние к концу, когда пользователь взаимодействует с интерфейсом. Таким образом, бэкэнду никогда не нужно запрашивать состояние клиента, и когда кнопка нажата, значения / состояние находятся на сервере, готовом к использованию.
Другой лагерь привязывает клиента к серверу так, что серверная часть всегда имеет доступ к клиенту Component
s и когда кнопка нажата, значения / состояние можно легко получить, взаимодействуя с компонентами.
Другой подход больше похож на то, о чем я говорил в моем предыдущем ответе, не привязывать серверную часть к клиенту вообще, а максимально полагаться на данные о событиях. Я поддерживаю этот подход там, где его достаточно.
Теперь вы можете свободно выбирать предпочитаемый подход, и у ZK есть много документации о том, как работать в любом из этих лагерей. Тогда возникает вопрос: где хранится состояние клиента на сервере (либо оно отправляется клиентом в MVVM, либо связывается там в MVC)? Я не думаю, что это вопрос, который можно решить здесь, это проблема разработки программного обеспечения. Я лично предлагаю вам взять стандартные шаблоны ZK, чтобы не идти в ногу со структурой. Если вы действительно хотите идти своим путем, вы можете получить ссылку на Listbox
на лету вот так:
public class Foo {
public static final String LISTBOX_ID = "myListbox";
public void renderListbox(Component parent, MyItem items) {
Listbox listbox = new Listbox();
listbox.setId(LISTBOX_ID);
listbox.setParent(parent);
for (MyItem item : items) {
listbox.appendItem(item.getName(), item);
}
}
}
public class Bar {
@Listen(Events.ON_CLICK + " = #saveButton")
public void saveButtonClicked(Event event) {
Component saveButton = event.getTarget();
Listbox listbox = (Listbox) saveButton.getFellow(Foo.LISTBOX_ID);
Set<Listitem> selection = listbox.getSelectedItems();
// do something
}