我有这个问题: 我有一个包含子编辑器的PresenterWidget。 这个小部件应该可以编辑“容器”元素。可以将这些容器分配给组。为此,我想从服务器获取所有可用组的列表。所以小部件设置如下(我使用GWTP):
public class ContainerEditorDialogPresenterWidget extends PresenterWidget<ContainerEditorDialogPresenterWidget.MyView> implements
ContainerEditorDialogUiHandlers {
private final PlaceManager placeManager;
private List<GroupDTO> groupList = new ArrayList<GroupDTO>();
private final DispatchAsync dispatcher;
@Inject
ContainerEditorDialogPresenterWidget(EventBus eventBus,
MyView view, PlaceManager placeManager, DispatchAsync dispatcher) {
super(eventBus, view);
getView().setUiHandlers(this);
this.dispatcher = dispatcher;
fetchGroups();
}
...
public void fetchGroups(){
FetchGroupsAction action = new FetchGroupsAction();
dispatcher.execute(action, new AsyncCallbackImpl<FetchGroupsResult>() {
@Override
public void onSuccess(FetchGroupsResult result) {
groupList = result.getGroupDtos();
eventBus.fireEvent(new GroupListUpdatedEvent(groupList));
}
});
}
所以我在构造函数中调用fetchGroups以尽早获取它。因为它是一个AynchCallback,我得到的结果“在某个时间”。然后我尝试使用GroupListUpdatedEvent将值传递给子编辑器。在那里我有一个这样的编辑:
public class GroupListEditor extends Composite implements
IsEditor<ListEditor<String, GroupItemEditor>> {
private static StringListEditorUiBinder uiBinder = GWT
.create(StringListEditorUiBinder.class);
interface StringListEditorUiBinder extends
UiBinder<Widget, GroupListEditor> {
}
//Gives us access to the event bus.
@Inject private EventBus eventBus;
...
public GroupListEditor() {
initWidget(uiBinder.createAndBindUi(this));
eventBus.addHandler(GroupListUpdatedEvent.TYPE, new GroupListUpdatedEvent.GroupListUpdatedHandler() {
@Override
public void onGroupListUpdatedEvent(GroupListUpdatedEvent event) {
Log.debug("onContainerUpdatedEvent caught");
allGroups = event.getGroupList();
if(allGroups != null) {
for (GroupDTO g : allGroups) {
lbAllGroups.addItem(g.getName(), g.getId().toString());
}
lbAllGroups.setVisibleItemCount(5);
Log.debug("Item list = " + lbAllGroups.getItemCount());
} else {
Log.debug("GROUP LIST is Null!");
}
}
});
}
当我尝试注册处理程序时,我得到一个例外。所以我希望eventBus没有正确注入。我想念什么,如果我不在演示者中,我如何使用活动和活动总线? 并且:这是用正确的方式来填充编辑器的“实用程序”数据吗?我想编辑应该直接与他们关心的数据相关联。但是我如何处理这种补充数据?
谢谢:)
答案 0 :(得分:0)
您在@UiField
ContainerEditorDialogPresenterWidgetView
中使用GroupListEditor
吗?
如果是这样,那么依赖注入将不起作用,因为您基本上手动创建导致GroupListEditor
为NULL的EventBus
。
我也会使用构造函数注入而不是字段注入。
GroupListEditor:
@Inject
public GroupListEditor(EventBus eventBus) {
this.eventBus = eventBus;
}
ContainerEditorDialogPresenterWidgetView:
public class ContainerEditorDialogPresenterWidgetView {
@UiField(provided=true)
GroupListEditor groupListEditor;
@Inject
public ContainerEditorDialogPresenterWidgetView(GroupListEditor groupListEditor);
this.groupListEditor = groupListEditor;
initWidget();
}
}
或者,您可以直接通过GroupListEditor
获取Ginjector
的实例。