Gwt 在共享(客户机-服务器)对象中插入;IsTreeItem";

Gwt 在共享(客户机-服务器)对象中插入;IsTreeItem";,gwt,guice,gwt-gin,Gwt,Guice,Gwt Gin,我有一个实现“IsTreeItem”的对象。对象显示为两级树项目。每个树项都带有一个复选框。 我需要知道一个复选框何时在改变值——所以我在听ValueChangedEvents 第一个问题是,使用这些项构建的树只激发SelectionEvents。如果选择正在更改复选框,则ValueChanged事件将在之后触发-因此无法从树中侦听“IsTreeItem”中的事件 所以我让我的“IsTreeItem”激发它自己的元素。因此,我(field)注入了一个EventBus,并在“ValueChange

我有一个实现“IsTreeItem”的对象。对象显示为两级树项目。每个树项都带有一个复选框。 我需要知道一个复选框何时在改变值——所以我在听ValueChangedEvents

第一个问题是,使用这些项构建的树只激发SelectionEvents。如果选择正在更改复选框,则ValueChanged事件将在之后触发-因此无法从树中侦听“IsTreeItem”中的事件

所以我让我的“IsTreeItem”激发它自己的元素。因此,我(field)注入了一个EventBus,并在“ValueChanged”时使用它触发事件。 问题是我的“IsTreeItem”是从服务器发送的对象(它位于共享包中,可序列化)。该对象在服务器上实例化(EventBus未被Ionject),并在客户端调用“asTreeItem”


是否有方法以某种方式将EventBus注入方法TreeItem asTreeItem()中?或者是否有其他方法让外部人员知道复选框是否已更改其值。

GIN可以对已创建的实例执行成员注入

您必须在
ginject
接口中创建一个方法,该方法将这样一个实例作为参数,返回类型为
void

注意,由于没有在客户机上进行反射,GIN将只注入用作参数类型的类(及其超类)中的字段和方法。


这不起作用,或者我做错了:将“void injectAttributeTreeItem(AttributeTreeItem);”添加到客户端注入器(也尝试使用IsTreeItem作为类型)。我的树项目有一个字段“@Inject private transient EventBus eb;”。同时,我通过客户端injector中的“EventBus getEventBus();”和树Item中的“ClientInjector=GWT.create(ClientInjector.class);eb=injector.getEventBus();”使其工作。但不知怎么的,这感觉很糟糕。gin什么时候会注入这样一个类?显然,您必须使用要注入其成员的对象调用
injectistreeitemembers()
。TBH,我相信你有一个设计问题;将
EventBus
放在DTO中感觉不对。除了更新包装好的DTO之外,您可能最好在客户端包装DTO以拦截setter并触发事件;你关于“设计问题”的看法绝对正确——在我们需要倾听“asTreeItem”中的事件时,我们考虑了重构,以将数据从可能的小部件表示中分离出来。但现在我们需要推出一个版本——重构必须等待;-)还有一个问题:什么时候给injectIsTreeItemMembers打电话?但在任何情况下,我都需要获得注入器“GWT.create(ClientInjector.class)”对吗?Q:“何时调用injectIsTreeItemMembers?”A:何时需要?问:“在任何情况下,我都需要使用注入器”GWT.create(ClientInjector.class)“对吗?”答:要共享单例
EventBus
,您需要使用单例
ClientInjector
@GinModules(MyGinModule.class)
interface MyGinjector extends Ginjector {
    …

    void injectIsTreeItemMembers(IsTreeItem item);
}