2013-06-21 3 views
1

Я использую GWTP для приложения. В этом приложении мне часто нужно сделать PresenterWidget, который содержит вкладки с PresenterWidget на каждой вкладке.Выполнение GWTP TabContainer для PresenterWidget

Как контейнер PresenterWidget, я не могу использовать класс TabContainerPresenter, поэтому я выполняю свою собственную реализацию.

У меня возникли некоторые проблемы при попытке управлять жизненным циклом PresenterWidget, содержащимся на вкладках (onReveal(), onHide() и т. Д.).

Первый вопрос: В данном конкретном случае, это рекомендуется вручную вызвать onReveal(), onHide() и т.д.?

2-й вопрос: Я пытался управлять жизненным циклом, не называя эти методы.

Это то, что я делаю: когда пользователь нажимает на вкладку, главный ведущий вызывает setInSlot(index,presenterWidget), чтобы поместить соответствующий PresenterWidget на правой вкладке.

Но: Когда я нажимаю на вкладке onReveal() вызывается соответствующий PresenterWidget тогда onReset() называется на все PresenterWidget (хорошо!): Все почему? Я ожидал бы, что onReset() вызывается только на PresenterWidget, соответствующем активной вкладке.

=>setInSlot() правильный способ позвонить в этом случае?

ответ

2

Может быть, это может быть полезным: https://github.com/ArcBees/GWTP/wiki/Presenter-%22Slots%22

  1. Я не рекомендовал бы вызвать метод жизненного цикла вручную. Без них он должен работать нормально.
  2. Вы хотите использовать метод setInSlot(), потому что в любой момент активен только один PresenterWidget.

Однако вы используете разные SLOTS для каждого PresenterWidget. Способ setInSlot() заключается в том, что он заменяет все, что PresenterWidget, которое было назначено этому слоту. Поскольку вы используете разные слоты для каждой вкладки, он не удаляет другой PresenterWidgets. Остальные PresenterWidget остаются в своих слотах и, вероятно, именно по этой причине вызывается onReset().
У вас есть 2 варианта:

  • Если вы хотите сохранить различные слоты вы должны вызвать removeFromSlot на всех невидимом PresenterWidgets.
  • Указать только один слот (TAB_CONTENT) и просто использовать setInSlot()
+0

Я попробовал решение с одним слотом, как отобразить один виджет в то время. Он работает намного лучше, но все еще не идеально: теперь, если я нажимаю на вкладку, 'onHide()' вызывается на предыдущей вкладке, 'onReveal()', то 'onReset()' вызывается только на новой вкладке. Проблема в том, что эти два метода всегда вызываются. Я ожидал бы, что 'onReveal()' вызывается только тогда, когда вкладка отображается в первый раз. Это правильно? Есть ли что-нибудь, что я могу сделать, чтобы иметь такое поведение? –

+0

Нет 'onReveal()' и 'onReset' вызывается вместе (см. Https://github.com/ArcBees/GWTP/wiki/Presenter-Lifecycle). Вы можете использовать 'onBind()', чтобы делать что-то, когда создается 'Presenter', или вы используете флаг, чтобы узнать, является ли это в первый раз –

+0

Хорошо, это ясно, спасибо вам большое :) –