Передача компонентов между viewImpl и place в GWT

#gwt

#gwt

Вопрос:

Я использую архитектуру MVP и пытаюсь отслеживать событие щелчка в таблице ячеек GWT.

1. У меня есть один класс ConfigureWiewImpl, который имеет ConfigurePlace в качестве места.

2.Класс ValidationViewImpl, который имеет ValidationPlace в качестве места.

У меня есть одна таблица в configureviewimpl.При щелчке по одному из его столбцов должно появиться другое место (ValidationPlace), чтобы перейти на другую страницу.Но я должен отслеживать событие щелчка по конкретной строке. Для этого я пытаюсь передать компонент, но без какого-либо успеха.

     final CellTable<UserBean> configGrid= new CellTable<UserBean>(5,(Resources) GWT.create(TableResources.class));
    final SingleSelectionModel<UserBean> selectionModel = new SingleSelectionModel<UserBean>();
    claimsGrid.setSelectionModel(selectionModel,
            DefaultSelectionEventManager.<UserBean> createDefaultManager());


    Column<UserBean, String> action = new Column<UserBean, String>(new ButtonCell()) {
        @Override
        public String getValue(UserBean object) {
            // Get the value from the selection model.
            return"images/edit.png";
        }

    };  
    configGrid.addColumn(action,"Action");
    action.setFieldUpdater(new FieldUpdater<UserBean, String>() {

        public void update(int index, UserBean object, String value) {
        //need to pass the bean 'object'
                     listener.goTo(new ValidationPlace());
        }
    }); 
  

Мне нужно передать ‘UserBean object’ в качестве аргумента ValidationPlace(), но GWT не позволяет передавать параметры компонента, поскольку он допускает только строку в качестве токенов.Есть ли способ, с помощью которого я могу отслеживать событие щелчка и передавать информацию на следующую страницу.Любые предложения приветствуются.Заранее спасибо.

Ответ №1:

Вы почти на месте — вам просто нужно передать свои компоненты в свое место, а затем сгенерировать из них токен.

Что-то вроде этого

 public class ValidationPlace extends Place {

    private final UserBean userBean;

    public ValidationPlace(UserBean userBean) {

        this.userBean = userBean;
    }

    public UserBean getUserBean() {

        return userBean;
    }

    public static class Tokenizer implements PlaceTokenizer<ValidationPlace> {

        @Override
        public String getToken(ValidationPlace place) {

            return "name="   userBean.getName();
        }

        @Override
        public ValidationPlace getPlace(String token) {

            // parse token into user bean and return new place
            return new ValidationPlace(createFromToken(token));
        }
    }
}

public static final UserBean createFromToken(String token) {
    Map<String, String> params = simpleParse(token);
    return new UserBean(params.get("name"), params.get("xyz"), ...);
}


public static final Map<String, String> simpleParse(String token) {

    Map<String, String> map = new HashMap<String, String>();
    if (token != null) {
        String[] params = token.split("amp;");
        for (String param : params) {
            String[] keyValues = param.split("=");
            if (keyValues.length > 1) {
                map.put(keyValues[0], keyValues[1]);
            }
        }
    }
    return map;
}
  

Синтаксический анализ параметров очень наивен и не обрабатывает экранирование, amp; ., = и т.д., но в целом этого достаточно.

Комментарии:

1. Спасибо за ответ Паули, но мне нужно отправить весь компонент в ValidtazionViewImpl с помощью ValidationPlace. Если я не ошибаюсь, в примере вы передаете только один из параметров. Кроме того, что такое createFromToken(токен)?

2. Это был просто пример — вам нужно было бы «сериализовать» все параметры, а затем написать функцию (которую я вызвал createFromToken()), чтобы воссоздать компонент из токена. У меня такое чувство, что это может быть не то, что вам нужно — похоже, у вас может быть какой-то волшебный процесс. Возможно, вам нужно сохранить компонент в модели, совместно используемой двумя страницами, а затем передать уникальную ссылку на этот компонент в качестве токена, где страница проверки может загрузить компонент из модели. Вам также нужно будет справиться со страницей, на которую ссылаются вне контекста — например, если кто-то закладывает эту страницу в закладки.

3. Спасибо Паули. Можете ли вы дать мне справочную страницу концепции сериализации. Это именно то, что я хочу. Поскольку я новичок в GWT, я не знаю концепции сериализации в GWT. Я пытался передать весь компонент в качестве аргумента в ValidationPlace(). Также мне нужно генерировать токен для каждого параметра.?

4. Сериализация — неправильное слово — я имел в виду токенизацию. «Официальная» ссылка здесь code.google.com/webtoolkit/doc/latest /. … Боюсь, что для выполнения «токенизации» вы в значительной степени сами по себе. Я включил простой imlp, который я использую.