我在我的gwt项目中使用mvp4g。对于我的一位演示者,我使用选项multiple=true
,我正在以这种方式创建和绑定演示者:
ObjectPresenter mainObject = eventBus.addHandler(ObjectPresenter.class, false);
mainObject.setId(id);
mainObject.bind();
view.addWidget(mainObject.getView().asWidget());
ObjectPresenter扩展了LazyPresenter。
当我从eventBus
抓住的ObjectPresenter
呼叫第一个事件时,bind()
的方法LazyPresenter
再次被调用。
bind
方法在树内有其他方法:createPresenter(); view.createView(); bindView();
。在bindView
的{{1}}方法中,我通过添加下一个小部件来修改我的视图。因为该方法被调用两次(一次由我直接调用,一次由框架调用),所以一些小部件被复制。
我调试了代码,发现来自ObjectPresenter
的事件被调用时,BaseEventHandler
的这部分代码被调用:
eventBus
直接致电public final boolean isActivated( boolean passive, String eventName, Object... parameters ) {
boolean activated = this.activated && pass( eventName, parameters );
if ( activated ) {
if ( passive ) {
return binded;
} else {
onBeforeEvent();
if ( !binded ) {
bind();
binded = true;
}
}
}
return activated;
}
(bind
后)mainObject.bind()
中的绑定属性未设置为BaseEventHandler
,因此首次调用true
方法时事件被召唤。
当方法bind
(直接调用)完成后,我可以在binded
中将BaseEventHandler
设置为true
变量,但我是不确定这是否是正确的方法...
你能否告诉我如何处理这个问题?
感谢您的帮助。
答案 0 :(得分:0)
首先,问题是,你真的需要multiple=true
- featrue。此功能旨在一次使用同一演示者类的sereval实例。如果不是这种情况,请不要使用它,因为您必须编写大量代码,这些代码通常由mvp4g框架生成。
此外,您不应该直接调用bind
- 方法。
如果您需要多功能,可以创建一个处理程序(扩展BaseHandler
- 类)。此处理程序应管理您的演示者实例。编码应包含您的演示者实例列表:
private List<EventHandlerInterface<MyEventBus>> presenters = new ArrayList<EventHandlerInterface<MyEventBus>>();
要显示新实例或甚至将现有实例置于最前面,处理程序应该监听事件(此处:eventBus.showObject([someNumber]);
:
public void onShowObject(long id) {
// check if a presenter for that Id already exists
if (presenters.size() > 0) {
for (int i = 0; i < presenters.size(); i++) {
ObjectPresenter presenter = (ObjectPresenter) presenters.get(i);
if (presenter.getId() == idNr) {
eventBus.setCurrentObject(presenter.getView().asWidget());
return;
}
}
}
// no presenter found, create a new one and add the presetner instance to the list
ObjectPresenter mainObject = eventBus.addHandler(ObjectPresenter.class);
mainObject.setId(id);
presenters.add(mainObject);
eventBus.setCurrentObject(mainObject.getView().asWidget());
}
}
事件setCurrentObject(Widget widget)
将使您的视图可见。因此,您的shell也必须实现为演示者/视图组合,必须监听setCurrentObject(Widget widget)
- 事件。使用此代码,您无需调用bind
- 方法。
我会在几个项目中使用此代码,它的工作非常好。此外,使用此代码很容易使用历史记录。
希望有所帮助。
答案 1 :(得分:0)
我还没有仔细阅读文档!我使用方法eventBus.addHandler(ObjectPresenter.class, false)
(带bind
参数),其中包含以下java doc。
/**
* Create a new instance of the handler, bind it only if this option is set to true and add it
* to event bus. If you decide not to bind the handler at creation, you will have either make
* sure the handler is displayed only after it handles its first method (otherwise the view is
* not binded so it seems inactive) or call manualy the bind method.<br/>
* <br/>
* When binding the handler, you have to call the isActivated method. This method will be called
* with eventName and parameters set to null.
*
* @param <T>
* type of the handler created
* @param handlerClass
* class of the handler to create
* @param bind
* if true, bind the handler at creation, otherwise do nothing.
* @return new instance of the handler created
*
* @throws Mvp4gException
* thrown if the instance of the handler can not be created by the event bus
*/
<E extends EventBus, T extends EventHandlerInterface<E>> T addHandler( Class<T> handlerClass, boolean bind ) throws Mvp4gException;
我错过的部分是绑定处理程序时,必须调用isActivated方法。将使用eventName和参数设置为null调用此方法。这是我的问题 - 我没有这样做!