2015-09-04 2 views
0

В моем проекте я хочу иметь пару представлений/презентаторов, где ведущий является абстрактным классом, который расширяется. Например, мой проект состоит из кучки вопросов, которые задаются по одному за раз. У меня может быть пара представлений/презентаторов для вопроса «да/нет». Я хотел бы иметь презентацию YesOrNo с абстрактными методами, такими как getQuestion, onYes, onNo. Раскрытие этого докладчика задало бы вопрос, и перегруженные uibinderHandlers могли бы позвонить в Yes и onNo. Затем я мог бы продлить презентацию YesOrNo с презентатором HasDogYesOrNo, который будет содержать логику бизнеса о том, что делать, если у пользователя есть собака. У меня может быть что-то похожее на HasCatYesOrNo.GWTP и классы абстрактного презентатора

Так что я создал два класса, которые расширяют общий

YesNoPresenter<T extends Proxy<?>> extends Presenter<YesNo.MyView, T> 

и каждый потом определяют классы, как

public class HasCatsYesNoPresenter extends YesNoPresenter<HasCatsYesNoPresenter.MyProxy> 

Когда я иду, чтобы связать их у меня есть

bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class, 
      HasCatsYesNoPresenter.MyProxy.class); 
bindPresenter(YesNoPresenter.class, YesNoPresenter.MyView.class, YesNoView.class, 
      HasDogsYesNoPresenter.MyProxy.class); 

Но я получаю сообщение об ошибке

$MyView is Double-bound: Bound at com.gwtplatform.mvp.client.gin.AbstractPresenterModule ... 

Кажется, что я не могу связать двух презентаторов с одним и тем же видом? Я действительно хотел повторить взгляды, но поместил за ними другую бизнес-логику. Есть ли лучший способ сделать это в GWTP? Мои обязательные объекты - это повторное использование одного и того же представления с презентатором бизнес-логики, и каждый из тех, кто представляет бизнес-логику, должен быть закладок. Точно так же, как и мои ведущие бизнес-логики должны быть анонимными классами, но это может потребовать слишком многого.

Есть и другие способы реализации моих презентаторов для моего простого случая YesNo, но у меня есть несколько более сложных презентаторов, которые, как мне кажется, лучший способ повторного использования кода - расширить базовый презентатор с логикой, необходимой для этого ведущего. Примером может служить «данопресент».

+0

Я вижу, мне нужно связать только презентатор с прокси-сервером и bindSharedView, чтобы привязать базовый презентатор к представлению. Но теперь я смущен тем, что должен расширить базовый презентационный (абстрактный) класс? Я спрашиваю, потому что прокси должен быть в классе presenterImpl, но в представлении базового класса? – Michael

ответ

0

Лучший способ повторного использования представления в нескольких презентаторах - создать PresenterWidget со связанным с ним представлением и ввести его в нужные вам докладчики.

Мои должен имущие это использовать тот же вид с различными бизнес-логики ведущего и иметь каждый из этих бизнес-логики предъявителей быть bookmarkable

Это именно то, что PresenterWidget для. Вот конкретный example PresenterWidget, который можно использовать повторно во всем приложении.

+0

Я не вижу, как 2 (или более) разных presenterWidget могут ссылаться на один и тот же вид через presenterWidget. Каждый PresenterWidget необходимо связать с View еще, и неясно, как вы связываете двух виджета ведущего с одним и тем же представлением. – Michael

+0

Как я вижу, это использовать PresenterWidget для повторного использования одного и того же представления, а не для того, чтобы связать один и тот же вид с другими презентаторами. – Renaud

0

Я считаю, что [как сказал Рено, вы ищете PresenterWidget. Однако я также думаю, что то, что вы хотите сделать, возможно только с презентаторами.

Что вы можете сделать, это объявить 1 вид интерфейса для каждого ребенка-ведущий (этот вид ребенка интерфейсы может продлить родитель один, если у вас есть какая-то логика вы хотите поделиться между ними)

Таким образом, вы бы

(Обратите внимание, что "->" означает "зависит от")

ParentPresenter -> ParentView 
ParentViewImpl implements ParentView 
ChildPresenter1 -> ChildView1 extends ParentView 
ChildPresenter2 -> ChildView2 extends ParentView 

bind(ChildView1).to(ParentViewImpl) 
bind(ChildView2).to(ParentViewImpl) 

// and then you would have to bind your proxies manually 
bind(MyProxy1.class).asEagerSingleton(); 
bind(MyProxy2.class).asEagerSingleton(); 

делая это, вы могли бы

Имеет ли это смысл?

0

bindPresenter способ ярлыка не предназначен для обработки вашего прецедента. Я считаю, что вы хотите сделать это:

bind(HasCatsYesNoPresenter.class).in(Singleton.class); 
bind(HasCatsYesNoPresenter.MyProxy.class).asEagerSingleton(); 
bind(HasDogsYesNoPresenter.class).in(Singleton.class); 
bind(HasDogsYesNoPresenter.MyProxy.class).asEagerSingleton(); 
bind(YesNoPresenter.MyView.class).to(YesNoView.class); 

Вид связывания не связан в одноэлементных, чтобы гарантировать, что новый экземпляр зрения будет закачиваться в каждом предъявитель.