【问题标题】:How to edit a Set<? extends EntityProxy> with GWT Editor framework?如何编辑集合<?使用 GWT 编辑器框架扩展 EntityProxy>?
【发布时间】:2012-06-01 13:01:48
【问题描述】:

为简单起见:

public class Person 
{
    String name; 
    Set<Address> addresses;
}

public class Address
{
     String city;
     String street;
}

与匹配

public interface PersonProxy extends EntityProxy 
{
     public String getName();
     public Set<AdressProxy> getAddresses();
}

public interface AdressProxy extends EntityProxy 
{
    public String getCity();
    public String getStreet();
}

我有 UiBuinder 类来编辑 AddressProxy 如果我得到 List 但数据是在 Person 类中设置的,我很清楚如何使用 ListEditor 如何使用编辑器框架来编辑它们? 或者当它变成 PersonProxy 时,我如何将 Set 转换为 List?

我尝试放置一种可以实现的适配器编辑器类

LeafValueEditor<Set<AddressProxy>>

然后在 LeafValueEditor.setValue() 内部移动到一个列表并在一个单独的编辑器层次结构上启动一个新的 driver.edit() 来处理列表编辑,但现在很幸运。

【问题讨论】:

    标签: gwt requestfactory gwt-editors


    【解决方案1】:

    我已经用点和路线完成了(一条路线包含 N 个点):

    路线(复合):

    @UiField
    TextBox name;
    
    @Ignore
    @UiField
    FlexTable listPoints;
    
    PointsEditor pointsEditor = new PointsEditor();
    
         ....
    
    pointsEditor.add(String id);
    

    积分编辑器:

    public class PointsEditor implements HasRequestContext<List<PointProxy>>, ValueAwareEditor<List<PointProxy>> {
    
        List<PointProxy> points = new ArrayList<PointProxy>(); 
    
        public void add(String id) {
           PointProxy point = ctx.create(PointProxy.class);
           point.setId(id);
           points.add(point);           
        }
    

    路由(服务器端):

    @Embedded
    private List<Point> points = new ArrayList<Point>();
    

    路由代理

    public interface RouteProxy extends EntityProxy {
    
           abstract List<PointProxy> getPoints();
    
           abstract void setPoints(List<PointProxy> points);
    

    点代理

    public interface PointProxy extends ValueProxy {
    
    ...
    
    }
    

    【讨论】:

    • 我明白你的意思,但问题是:鉴于 PointProxy 有几个字段和它自己的编辑器,我如何连接这些点?并注意问题是关于 Set> 而不是 List> 列表编辑是微不足道的,因为 GWT SDK 中的帮助类和相应的示例代码。
    • 忘了说RouteProxy(EntityProxy)和PointProxy(ValueProxy)。两者都被添加到答案中。试着用 Set 代替 List。
    【解决方案2】:

    您应该创建一个CompositeEditor&lt;Set&lt;AddressProxy&gt;, AddressProxy, AddressEditor&gt;,类似于ListEditor,但处理的是Set,而不是List。 我想你可以以某种方式委托给ListEditor,尽管我真的不确定。

    【讨论】:

    • 谢谢!这是开始的事情。坦率地说,我很懒,希望有一些代码的链接:-)。
    • 我认为某种类型的标准 SetEditor(可能委托给 ListEditor)应该由 GWT 提供。我遇到了与 OP 相同的问题,最终在域类上暴露了List-typed 访问器(转换真正的Set-typed 属性),以便能够使用ListEditor。但这并不总是可以做到(有时我们只需要客户端的Set-wise 行为)
    • 问题是 a) 定义的 Set 没有特定的顺序,并且值的子编辑器必须是 list,并且 b) 您可能希望允许重复编辑过程中的值,并且只在 flush 时检查唯一性,但是你必须以某种方式告诉用户什么时候是这种情况(“嘿,我有 4 个值,当我保存它时只保留了 3 个他们!”);唯一性取决于您如何在编辑的对象中实现equals()。但是,如果您能提出一个标准 SetEditor,那么请贡献它!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    相关资源
    最近更新 更多