单个或多个商店实例在不同的组件上?
这更像是一个最佳实践/建议,我问在这里,因为我已经找到了解决我的问题,但我不知道:单个或多个商店实例在不同的组件上?
- 如果“问题”应该得到解决;
- 如果解决方案是最好的。
等等,让我们回过头来看看这个问题。我有一本图书管理器应用程序,它使用了两种对象:Book
和Author
。你可以想像,每Book
有Author
,所以,我需要:
- 经理定义的作者(我使用了一个网格);
- 一种为书选择作者的方法(我已经使用了组合框);
在ExtJS中,这涉及到Ext.grid.Panel
和Ext.form.field.ComboBox
。 我在每个部件上使用了相同的商店(AuthorStore
),因为我的Author
类非常简单(只有id
和authorName
作为字段)。最初,我使用autoLoad:true
属性为商店,但是,正如我发现here,有一种更好的方法来执行此操作:将商店加载到所需组件的render
或afterrender
事件中。我完全同意这种说法。
之后,我已经注意到,网格和组合都有不同的存储实例(每个都加载其数据)。这对我来说似乎很奇怪,因为基本上,两个存储实例都保持完全相同的数据。此时,我想以某种方式为这两个组件共享同一个商店实例。我不喜欢的东西:
-
定义返回单个存储实例的功能:
function getAuthorStore(){ return Ext.StoreMgr.lookup('authorStore') || Ext.create('BM.store.AuthorStore'); }
更改网格的商店财产
store: 'AuthorStore',
到store: getAuthorStore()
做同样的事情为组合-box
-
更改
AuthorStore
以声明addit有理财产并为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'
,使组合的商店不要当负载本身打开组合物品。.... queryMode: 'local', store: getAuthorStore(), listeners: { render: function(combo, options) { var store = combo.getStore(); if (!store.loaded) { store.load(); } } }
什么,我想知道的答案是以下几个问题:
- 是单店的实例想法好还是坏?
- 我们假设我在网格上有一些过滤器。这些过滤器会导致组合显示,比方说,组合中的项目较少, ,因为它们共享相同的商店? (因此,在这种情况下,商店 不应在多个小部件之间共享)。
- 如果有更好的/更清洁的解决方案呢?
非常感谢您花时间阅读我的问题。请分享您的想法,如果有的话。
- 如果您希望在多个视图中具有相同的数据,则单个商店是个不错的主意。
- 这是正确的,过滤器将适用于所有商店。
- 在EXT5“的连锁店”的概念已经实施,在这里看到的更多信息:http://docs.sencha.com/extjs/5.0/apidocs/#!/api/Ext.data.ChainedStore
你可以看到分机5的连锁店在这里的行动:http://extjs.eu/on-连锁店/ – Saki 2014-10-27 10:05:12
谢谢大家的回答。 @Saki:你的ExtJS例子很有名!保持良好的工作! ;-) – hypercube 2014-10-28 07:50:21