不同组件上的单个或多个商店实例?

时间:2014-10-26 22:51:14

标签: javascript extjs extjs4.2

这更像是我在这里要求的最佳做法/建议,因为我已经找到了解决问题的方法,但我不知道:

  • 如果“问题”应该解决;
  • 如果解决方案是最好的解决方案。

等等,让我们回过头来讨论这个问题。我有一个图书管理器应用程序,它使用了两种对象:BookAuthor。可以想象,每个Book都有一个Author,所以,我需要:

  • 管理员定义作者(我使用过网格);
  • 一种为书籍选择作者的方法(我使用了一个组合框);

在ExtJS中,这涉及Ext.grid.PanelExt.form.field.ComboBox。 我在每个小部件上使用了相同的商店(AuthorStore),因为我的Author类非常简单(只有idauthorName作为字段)。最初,我使用autoLoad:true属性作为商店,但是,正如我发现here,有更好的方法:在render或{{1}上加载商店所需组件的事件。我完全同意这种说法。

之后,我注意到网格和组合都有不同的存储实例(每个都加载其数据)。这对我来说似乎很奇怪,因为基本上,两个商店实例都拥有完全相同的数据。此时,我想以某种方式为两个组件共享相同的商店实例。我做了类似的事情:

  • 定义了一个返回单个商店实例的函数:

    afterrender
  • 将网格的商店属性从function getAuthorStore(){ return Ext.StoreMgr.lookup('authorStore') || Ext.create('BM.store.AuthorStore'); } 更改为store: 'AuthorStore',

  • 为组合框做了同样的事情

  • 更改store: getAuthorStore()以声明AuthorStore事件的附加属性和侦听器:

    load
  • storeId: 'authorStore', loaded: false, listeners: { load: function(store, records, success, operation, options) { store.loaded = success; console.log('store <<' + store.storeId + '>> was fully reloaded'); } } 更改为网格的控制器商店属性为store: 'AuthorStore',。此外,添加了store: getAuthorStore()事件,并调用以下函数:

    render
  • 最后,我做了类似于组合框的操作(请注意使用的 loadStoreIfRequired: function() { var me = this; // loads the store only if the 'loaded' custom prop is not set if (!me.store.loaded) { me.store.load(); } } ,以便组合商店在打开组合项时不会加载自己。

    queryMode: 'local'

我想知道的是以下问题的答案:

  1. 单店实例的想法是好还是坏?
  2. 假设我在网格上有一些过滤器。这些过滤器会导致组合显示,比如说,组合中的项目较少, 既然他们共用同一家商店? (因此,在这种情况下,商店 不应在多个小部件之间共享。)
  3. 如果有更好/更清洁的解决方案吗?
  4. 非常感谢你花时间阅读我的问题。如果你有,请分享你的想法。

1 个答案:

答案 0 :(得分:2)

  1. 如果您希望在多个视图中拥有相同的数据,那么单个商店是个好主意。
  2. 这是正确的,过滤器将应用于所有商店。
  3. 在Ext5中,已经实施了“链式商店”的概念,有关详细信息,请参阅此处:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.ChainedStore