Отношение мест GWT к действиям на экране?

Я пытаюсь написать приложение GWT, которое повторно использует один и тот же шаблон для каждой «страницы» (места). Есть 4 основные «страницы» приложения:

  • Страница панели инструментов (http://www.mywebapp.com/#dashboard)
  • Страница калькулятора (http://www.mywebapp.com/#calc)
  • Страница конфигуратора (http://www.mywebapp.com/#config)
  • Страница входа (http://www.mywebapp.com/#login)

Каждая «страница» имеет одинаковый шаблонный внешний вид: (1) раздел заголовка, который содержит логотип и меню навигации, (2) раздел контента, который содержит контент, специфичный для «страницы» (т. е. будет отличаться для #dashboard место, #login место и т. д.) и (3) раздел нижнего колонтитула, содержащий несколько ссылок. Итак, вы видите, единственное, что меняется от страницы к странице, — это раздел контента. Так же, как обычный шаблонный веб-сайт.

Дело в том, что каждая «страница» (место) на самом деле представляет собой довольно сложный пользовательский интерфейс с множеством различных панелей, состоящих из множества виджетов. Когда пользователь взаимодействует с приложением, эти панели будут появляться и исчезать, а отображение будет постоянно меняться. Например, на странице #calc пользователь может выбрать, в каком «режиме» отображать калькулятор: в базовом или в расширенном. Когда пользователь выбирает Дополнительно, отображаются несколько дополнительных панелей (в дополнение к панели Основные).

Было бы неплохо иметь возможность сохранять такие действия в истории, чтобы пользователь мог добавить приложение в закладки в режиме Basic или Advanced, например:

  • http://www.mywebapp.com/#calc/basic; or
  • http://www.mywebapp.com/#calc/advanced

Вот в чем проблема:

У нас уже есть несколько «уровней» мероприятий/мест, происходящих здесь. На уровне «приложения» у нас есть шаблон, который нужно показать пользователю при загрузке MyWebAppModule implements EntryPoint. Это TemplatePlace является местом по умолчанию/начальным, которое зарегистрировано в HistoryHandler перед вызовом:

public class MyWebAppModule implements EntryPoint {
    @Override
    public void onModuleLoad() {
        // ...

        // The first place we go to when this module downloads.
        TemplatePlace templatePlace = getSomehow();

        historyHandler.register(placeController, eventBus, templatePlace);
        historyHandler.handleCurrentHistory();
    }
}

Затем у нас есть все разные «страницы»: DashboardPlace, CalculatorPlace и т. д., каждая из которых имеет свои уникальные представления/отображения. Например, когда пользователь щелкает ссылку Калькулятор, чтобы перейти к CalculatorPlace, он должен отображать представление, отличное от того, когда указывает, что он хочет использовать калькулятор в базовом или расширенном режиме.

Наконец, у нас есть разные области отображения, панели и т. д. внутри каждой страницы/места, например, BasicCalculatorPlace и AdvancedCalculatorPlace. Вот что я имею в виду под разными «уровнями» навигации:

  1. Уровень приложения (шаблон для применения ко всем страницам/местам)
  2. Уровень страницы или места
  3. Уровень дисплея или панели

Вопрос:

Я хочу получить URL-адреса (места) с закладками, когда пользователь выполняет все следующие действия:

  • Переходит на главную страницу (http://www.mywebapp.com)
  • Переходит на любую из "страниц" (http://www.mywebapp.com/#calc и т.д.)
  • Использует страницы/места, которые вызывают специфичные для страницы настройки панели или отображения (http://www.mywebapp.com\#calc\#advanced и т. д.)

Сколько действий и мест я могу создать? Сколько ActivityManagers? Наверное, я спрашиваю, насколько детальными должны быть Activity/Places для каждого «уровня» пользовательского интерфейса с закладками. Заранее спасибо!


person Community    schedule 10.11.2012    source источник


Ответы (1)


Я думаю, вам нужен только один ActivityManager и одно действие на «страницу». Вы можете превратить свой «верхний» и «нижний колонтитул» в виджеты, которые можно повторно использовать на каждой странице.

Вы можете добавлять в закладки разные состояния одной и той же страницы с помощью токенов. Например, вы можете установить токен на «базовый» — это сообщит CalculatorActivity, чтобы показать базовую панель калькулятора. URL-адрес будет выглядеть так:

www.myApp.com/?#Calculator:basic

Когда пользователь нажимает на виджет, чтобы выбрать расширенный параметр, вы делаете

PlaceController.goTo(new CalculatorPlace("advanced"));

CalculatorActivity получит CalculatorView (который уже отображается), он увидит, что токен установлен на «расширенный», и даст указание этому представлению отображать расширенные панели.

Обратите внимание, что вы можете сделать свои токены настолько подробными, насколько это необходимо, а затем проанализировать их в Activity. Например, у вас может быть что-то вроде

www.myApp.com/?#Calculator:option=basic&position=top&theme=pink
person Andrei Volgin    schedule 10.11.2012
comment
Спасибо @Andrei Volgin (+1) - как мне получить более сложный токен в моем PlaceHistoryMapper, like your example of: option=basic&position-top&theme=pink`? Это буквально так же просто, как if(place instanceof CalculatorPlace) return option=basic&position=top&theme=pink; или сложнее? Еще раз спасибо! - person ; 11.11.2012
comment
Кроме того, просто для уточнения: 1 подкласс Place на страницу и 1 ActivityManager на страницу, но сколько ActivityMapper? Всегда ли должно быть соотношение 1 к 1 между ActivityManager и их ActivityMapper, или вы можете передавать одни и те же ActivityMapper нескольким менеджерам? Я думаю, что это лежит в основе моей путаницы в отношении детализации. - person ; 11.11.2012
comment
Вам нужен только один ActivityMapper и один ActivityManager для всего приложения, а не для каждой страницы. В этой статье это довольно хорошо объясняется: developers.google.com/web-toolkit/doc /последний/. Также посмотрите несколько примеров: code.google.com/p/gwt-examples/ wiki/DemoActivitiesAndPlaces - person Andrei Volgin; 11.11.2012
comment
Но если у вас есть только 1 ActivityManager для вашего приложения, что означает, что его setDisplay(AcceptsOneWidget) может содержать только один виджет за раз, как у вас есть несколько областей отображения на одном экране, которые могут обновляться независимо друг от друга? - person ; 11.11.2012
comment
Если вы хотите работать с несколькими регионами, прочитайте блестящий пост Томаса: tbroyer.posterous .com/gwt-21-activities-nesting-yagni Однако, если вам просто нужно меню и нижний колонтитул, вы можете превратить их в виджеты и просто добавить на каждую страницу, где они вам нужны. Например, ваш основной виджет, который вы передаете в AcceptsOneWidget, может быть LayoutPanel (или DockLayoutPanel). Виджет меню займет верхнюю часть, виджет нижнего колонтитула — нижнюю часть, а затем вы добавите свои панели для конкретной страницы в середине. Включение одного и того же виджета на несколько страниц не увеличит размер вашего кода. - person Andrei Volgin; 11.11.2012