Sencha:迭代自定义 BaseModel 子类的列表存储

发布于 2024-11-05 04:17:20 字数 2355 浏览 0 评论 0原文

我昨天刚开始玩 Sencha 的 Ext GWT,但遇到了困难。我结合了 JSON 加载网格和可编辑网格中的方法。作为测试数据集,我使用星际之门亚特兰蒂斯剧集列表,因此 SGAEpisode 定义为:

public class SGAEpisode extends BaseModel {
  public SGAEpisode() {

  }

  public SGAEpisode(String season, String episode) {
    set("season",season);
    set("episode",episode);
  }

  public void setSeason(String season) {
    set("season",season);
  }

  public String getSeason(){
    return get("season");
  }

  public void setEpisode(String name) {
    set("episode",name);
  }

  public String getEpisode() {
    return get("episode");
  }

  public String toString() {
    return "Season: " + get("season") + " episode: " + get("episode");
  }
} 

onModuleLoad() 开始于...

ModelType type = new ModelType();
type.setRoot("seasons");
type.addField("Season","season");
type.addField("Episode","episode");

String path = GWT.getHostPageBaseURL() + "senchaapp/sgaepisodes";

final RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,path);
final MVProxy<String> proxy = new SProxy<String>(builder);

JsonLoadResultReader<ListLoadResult<SGAEpisode>> reader = new JsonLoadResultReader<ListLoadResult<SGAEpisode>>(type);
final BaseListLoader<ListLoadResult<SGAEpisode>> loader = new BaseListLoader<ListLoadResult<SGAEpisode>>(proxy,reader);

final ListStore<SGAEpisode> episodes = new ListStore<SGAEpisode>(loader);

所以 loader.load() 效果很好,填充网格,我可以编辑字段,但我没有看到 commitChanges() 做任何事情,并且我无法迭代 ListStore “episodes” 来收集更改或添加的值。哦,SProxy 只是一个 DataProxy 子类,它允许我指定要加载到网格中的季节的 JSON。

如果我尝试其中任何一个

for(SGAEpisode episode : episodes) {
  save(episode);
}

,或者

for(int i = 0; i < episodes.getCount(); i++) {
  save(episodes.getAt(i));
}

收到异常消息“com.extjs.gxt.ui.client.data.BaseModel 无法转换为 com.mvsc.sencha.shared.SGAEpisode”,你知道我做错了什么吗?到那时为止的所有内容都已用 SGAEpisodes 定义/填充......

附录 好的,所以如果我尝试

List<Record> modified = episodes.getModifiedRecords();

for(Record r : modified) {
  ModelData md = r.getModel();
  save(md.get("season"),md.get("episode")); 
}

,我可以迭代并获取修改后的值,但是如果我必须像这样使用基类,那么拥有 ModelData 子类有什么意义呢?这让我觉得我实际上不必……有什么帮助?

附录 2 我尝试对 BaseModelData 进行子类化,但没有成功。

I just started playing with Sencha's Ext GWT yesterday and I've hit a wall. I combined methods from their JSON loaded grid and their editable grid. As a test data set I'm using a list of Stargate Atlantis episodes hence the SGAEpisode which is defined as:

public class SGAEpisode extends BaseModel {
  public SGAEpisode() {

  }

  public SGAEpisode(String season, String episode) {
    set("season",season);
    set("episode",episode);
  }

  public void setSeason(String season) {
    set("season",season);
  }

  public String getSeason(){
    return get("season");
  }

  public void setEpisode(String name) {
    set("episode",name);
  }

  public String getEpisode() {
    return get("episode");
  }

  public String toString() {
    return "Season: " + get("season") + " episode: " + get("episode");
  }
} 

the onModuleLoad() starts off with...

ModelType type = new ModelType();
type.setRoot("seasons");
type.addField("Season","season");
type.addField("Episode","episode");

String path = GWT.getHostPageBaseURL() + "senchaapp/sgaepisodes";

final RequestBuilder builder = new RequestBuilder(RequestBuilder.GET,path);
final MVProxy<String> proxy = new SProxy<String>(builder);

JsonLoadResultReader<ListLoadResult<SGAEpisode>> reader = new JsonLoadResultReader<ListLoadResult<SGAEpisode>>(type);
final BaseListLoader<ListLoadResult<SGAEpisode>> loader = new BaseListLoader<ListLoadResult<SGAEpisode>>(proxy,reader);

final ListStore<SGAEpisode> episodes = new ListStore<SGAEpisode>(loader);

so loader.load() works great, populating a grid, I can edit fields, but I don't see commitChanges() doing anything and I can't iterate over the ListStore "episodes" to gather changed or added values. Oh, and SProxy is just a DataProxy subclass to allow me to specify the season's JSON I'm loading into the grid.

If I try either

for(SGAEpisode episode : episodes) {
  save(episode);
}

or

for(int i = 0; i < episodes.getCount(); i++) {
  save(episodes.getAt(i));
}

I get an exception with the message "com.extjs.gxt.ui.client.data.BaseModel cannot be cast to com.mvsc.sencha.shared.SGAEpisode" Any idea what I'm doing wrong? Everything up to that point was defined/populated with SGAEpisodes.....

Addendum
Ok, so if I try

List<Record> modified = episodes.getModifiedRecords();

for(Record r : modified) {
  ModelData md = r.getModel();
  save(md.get("season"),md.get("episode")); 
}

I can iterate, and get the modified values, but what's the point of having a ModelData subclass if I have to use the base class like this. Which makes me think I don't in fact have to..... little help?

Addendum 2 I tried subclassing BaseModelData instead with no success.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

才能让你更想念 2024-11-12 04:17:20

我知道这是一篇较旧的帖子,我也遇到了同样的问题。我就是这样解决的。
尝试迭代 listStore 中的模型。

for(SGAEpisode episode : episodes.getModels()) {
    save(episode);
}

I know its an older post, I had the same issue. This is how I fixed it.
try iterating through the models in listStore.

for(SGAEpisode episode : episodes.getModels()) {
    save(episode);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文