Измените состояние в настраиваемом виджете Vaadin в коннекторе, нажав кнопку GWT, и получите его на стороне сервера.

Я пытаюсь установить состояние в пользовательском виджете Vaadin с помощью щелчка, созданного пользователем. В соединителе компонентов после создания экземпляра rpc сервера я получаю кнопку GWT и добавляю метод onclick. В этом методе я устанавливаю состояние (getState.text = "new text";), но когда я пытаюсь получить его со стороны сервера, я получаю исходный текст состояния. Метод onStateChange не запускается.

Код в коннекторе:

        getWidget().getSaveButton().addClickHandler(new ClickHandler() {

        @Override
        public void onClick(ClickEvent event) {
            alert("does it work without jquery?");
            getState().text = "text changed from connector";
            getWidget().getTextBox().setText(getState().text);
        }
    });

после нажатия кнопки GWT текстовое поле содержит текст «текст изменен из коннектора»

В состоянии:

public String text = "original state text";

Реализация пользовательского интерфейса для получения состояния:

vaadinButton.addClickListener(new ClickListener() {

        @Override
        public void buttonClick(ClickEvent event) {
            Notification.show(sig.getState().text);

        }
    });

При нажатии кнопки vaadin после нажатия кнопки GWT в уведомлении по-прежнему отображается «текст исходного состояния».

Мой вопрос: как мне изменить состояние в коннекторе, чтобы он запускал метод onStateChange, и я получал текстовые изменения на стороне сервера?


person FCoffee    schedule 27.02.2015    source источник


Ответы (1)


Невозможно обновить состояние со стороны клиента. Только сервер может обновлять состояние. Вы должны сделать так, чтобы вы отправили запрос RPC от клиента к серверу, а на сервере вы обновили значение до состояния.

Изменить, вот пример того, как отправить значение от клиента к серверу с использованием механизма RPC Vaadin:

Создайте интерфейс, расширяющий ServerRpc:

public interface MyServerRpc extends com.vaadin.shared.communication.ServerRpc {
  void setValue(String value)
}

Используйте прокси, созданный из вышеуказанного интерфейса, для отправки значения на сервер. Этот вызов выполняется внутри соединителя.

getRpcProxy(MyServerRpc.class).setValue("New value to server");

Зарегистрируйте реализацию интерфейса для вашего серверного компонента для приема вызовов RPC:

registerRpc(new MyServerRpc() {

  public void setValue(String value) {
    // set the value to state here by saying getState().myValue = value;
    // or do something else
  }
});
person Henri Kerola    schedule 28.02.2015
comment
Большое спасибо, Анри. Прошло немного времени с тех пор, как я вас видел. Я плевательница кофе из класса Нью-Йорка - person FCoffee; 02.03.2015
comment
@FCoffee, а, надеюсь, там все отлично. - person Henri Kerola; 02.03.2015
comment
Дела идут хорошо. С тех пор я никому не закашлялся :) Проблема, которую я хочу решить, заключается в том, что я пытаюсь вернуть строку json из виджета на стороне клиента. Судя по вашему ответу, я не могу этого сделать через государство. Единственный способ сделать это уже существующие компоненты Vaadin? Например, возьмите строку json и поместите ее в Vaadin TextArea, а затем получите текст на стороне сервера. Я бы, вероятно, поместил настраиваемый виджет в составной компонент с TextArea. - person FCoffee; 02.03.2015
comment
Для этого вы можете использовать RPC. Я редактирую ответ и добавляю пример. - person Henri Kerola; 03.03.2015
comment
Ваш пример мне очень помог. Я могу изменить состояние. Большое спасибо, Анри. - person FCoffee; 03.03.2015