GWT - Где я должен использовать разбиение кода при использовании мест / занятий / картографов? - PullRequest
4 голосов
/ 16 марта 2011

«ядро» относится к начальной части приложения, которое загружается.

  • Чтобы привязать URL к местам, GWT использует PlaceTokenizer<P extends Place>. При загрузке приложения из URL-адреса он вызывает метод P getPlace(String token), чтобы получить новый экземпляр места для вызова.

    из-за асинхронной природы разделения кода, я не могу создать место внутри runAsync в этом методе. Поэтому я должен поместить все места моего приложения в ядро.

  • Чтобы связать места с действием, GWT вызывает Activity getActivity(Place place) (из com.google.gwt.activity.shared.ActivityMapper), чтобы получить новый экземпляр действия.

    Еще раз, я должен поместить все мои действия в ядро.

Вот что я хочу попробовать: написать кастом com.google.gwt.place.shared.Delegate, который

  • привязать себя к PlaceChangeRequestEvent. Если AppPiece, соответствующий запрашиваемому объекту, не загружен, он вызывает event.setWarning(NEED_TO_LOAD_MODULE)
  • в методе confirm(String message), всегда возвращают false, когда сообщение равно NEED_TO_LOAD_MODULE (так что это не беспокоит пользователя), и загружают модуль через RunAsync.
  • После загрузки модуля позвоните goTo(requestedPlace)

Каждый AppPiece моего приложения содержит набор активностей и соответствующих представлений. Поскольку мапперы вызываются только при срабатывании PlaceChangeEvent, я могу сгенерировать новый экземпляр моей активности через AppPiece.getSomeActivityInstance().

Я почти уверен, что это сработает, но меня беспокоит то, что

  • Поиск того, какой AppPiece загружать в зависимости от запрошенногоPlace, заставит меня написать код, который будет очень похож на мои мапперы
  • Я бы хотел, чтобы мои места были в соответствующем AppPiece
  • Переопределение Delegate для этой цели сложно, и я ищу лучшее решение

1 Ответ

5 голосов
/ 22 марта 2011

Вам не нужно помещать все свои действия в ядро ​​ (как вы его называете): в то время как экземпляр Activity извлекается синхронно, ему разрешено запускать асинхронно. Это то место, куда вы бы позвонили GWT.runAsync.

См. http://code.google.com/p/google-web-toolkit/issues/detail?id=5129 и https://groups.google.com/d/topic/google-web-toolkit/8_P_d4aT-0E/discussion

...