«ядро» относится к начальной части приложения, которое загружается.
Чтобы привязать 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
для этой цели сложно, и я ищу лучшее решение