Получение выбранных значений 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 Components при нажатии кнопки.

(Игнорирование проблемы с несколькими классами в течение минуты)
С высокого уровня, в сообществе ZK есть два типа лагерей. Более новый подход MVVM предполагает, что представление должно выдвигать соответствующее состояние к концу, когда пользователь взаимодействует с интерфейсом. Таким образом, бэкэнду никогда не нужно запрашивать состояние клиента, и когда кнопка нажата, значения / состояние находятся на сервере, готовом к использованию.

Другой лагерь привязывает клиента к серверу так, что серверная часть всегда имеет доступ к клиенту Components и когда кнопка нажата, значения / состояние можно легко получить, взаимодействуя с компонентами.

Другой подход больше похож на то, о чем я говорил в моем предыдущем ответе, не привязывать серверную часть к клиенту вообще, а максимально полагаться на данные о событиях. Я поддерживаю этот подход там, где его достаточно.

Теперь вы можете свободно выбирать предпочитаемый подход, и у 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
}
Другие вопросы по тегам