【问题标题】:Custom object filter for a grid column in sencha GXTsencha GXT 中网格列的自定义对象过滤器
【发布时间】:2013-05-07 14:04:40
【问题描述】:

重要修改:我为情况添加了一个深度级别,以更好地反映我的问题。

我有一个 GXT Grid 和一个特定类型的 ListStore FooFoo 恰好有一些重要的对象属性,包括Bar 类型之一。 Bar 类型由两个对象属性组成:fooFoo 类型为 FooFoobarBar 类型为 Barbar。这两个可以是null,并且有一个String 属性description

我想使用 GXT 网格的过滤功能通过 Bar 值的 FooFooBarBar 描述过滤 Foo 对象记录。

我尝试将ValueProvider<Foo, String> barDescription(); 添加到FooProperties,结果是:

StringFilter<Foo> barbarFilter = new StringFilter<Foo>(fooProps.barbarDescription());

其中Foo#getBarBarDescription()实现如下:

public String getBarBarDescription() {
    return this.getBar().getBarBar().getDescription();
}

是否有一种简单/方便的方法可以在 GXT 中实现此行为?没找到。

我上面描述的实现是我尝试过的,但是过滤器根本没有显示在网格中,没有更多的错误消息。

针对 Colin 对我之前版本问题的回答,我尝试了以下方法:

@Path("bar.barbar.description")
ValueProvider<Foo, String> barbarDescription();

希望它致电Foo#getBar().getBarBar().getDescription()。我怀疑 FooFoo 和 BarBar 可能是 null 可能会导致问题。

【问题讨论】:

  • 在我看来你做得对,没有其他简单的方法。

标签: java gwt grid gxt


【解决方案1】:

如果你想让barDescription() 在你的Foo 对象上调用getBar().getDescription(),那么试试这个:

public interface FooProperties extends PropertyAccess<Foo> {

  @Path("bar.description")
  ValueProvider<Foo, String> barDescription();

  //...
}

@Path 注释在这里的工作方式与在编辑器框架中的工作方式相同 - 您可以使用它来指定要访问的属性的路径。这允许您跳过在自己的 Foo 对象中创建 getBarDescription() 方法。

另一种选择是构建您自己的ValueProvider 实现。使用PropertyAccess 是一种要求编译器为您完成工作的方法,但没有什么能阻止您自己做。在这种情况下,它可能如下所示:

public class FooBarDescriptionValueProvider implements ValueProvider<Foo, String> {
  public String getValue(Foo object) {
    //TOOD consider a object.getBar() null check?
    return object.getBar().getDescription();
  }
  public void setValue(Foo object, String value) {
    object.getBar().setDescription(value);
  }
  public String getPath() {
    return "bar.description";
  }
}

请注意,这几乎与 PropertyAccess 生成的版本完全相同,但它允许您根据需要自定义行为。

【讨论】:

  • 感谢您的帮助科林。不幸的是,我忘记在我原来的问题中提到一个深度级别。起初这似乎微不足道,但由于使用您提供的答案似乎不起作用(见问题),我想我会提供额外的信息。
  • 是的,null 是一个问题(因为如果 Bar 为 null,String 应该是什么?) - 我将更改问题以尝试解决您的一些选项。
  • 也就是说,我将更改答案
  • 谢谢。我应该如何使用自定义提供程序?我试过StringFilter&lt;Foo&gt; barbarFilter = new StringFilter&lt;Foo&gt;(new CascadedValueProviders().new FooBarBarBarValueProvider()); 无济于事。
  • 您能用您的 valueprovider 代码更新问题吗? “无济于事”没什么好评论的。基本思想是只在getValue(Foo) 方法中进行空检查。抱歉我没有更新答案,最近有点忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
相关资源
最近更新 更多