Javascript 不同组件上的单个或多个存储实例?
这更像是我在这里提出的最佳实践/建议,因为我已经找到了解决问题的方法,但我不知道:Javascript 不同组件上的单个或多个存储实例?,javascript,extjs,extjs4.2,Javascript,Extjs,Extjs4.2,这更像是我在这里提出的最佳实践/建议,因为我已经找到了解决问题的方法,但我不知道: "问题"是否得到解决; 如果解决方案是最好的 等等,让我们回到问题上来。我有一个book manager应用程序,它使用两种对象:book和Author。可以想象,每本书都有一位作者,因此,我需要: 定义作者的管理者(我使用了网格) 为一本书选择作者的方法(我使用了一个组合框) 在ExtJS中,这涉及一个Ext.grid.Panel和一个Ext.form.field.ComboBox。 我在每个小部件上使
- "问题"是否得到解决;李>
- 如果解决方案是最好的
book
和Author
。可以想象,每本书
都有一位作者
,因此,我需要:
- 定义作者的管理者(我使用了网格)李>
- 为一本书选择作者的方法(我使用了一个组合框)李>
Ext.grid.Panel
和一个Ext.form.field.ComboBox
。
我在每个小部件上使用了相同的存储(AuthorStore
),因为我的Author
类非常简单(只有id
和authorName
作为字段)。最初,我对存储使用了autoLoad:true
属性,但是,正如我发现的,有一种更好的方法:在render
或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'); } }
- 最后,我做了一些类似于组合框的事情(请注意使用的
),这样组合的存储在打开组合项时不会自动加载queryMode:'local'
.... queryMode: 'local', store: getAuthorStore(), listeners: { render: function(combo, options) { var store = combo.getStore(); if (!store.loaded) { store.load(); } } }
你可以在这里看到Ext5连锁商店的运作:谢谢大家的回答。@Saki:你的ExtJS例子很有名!继续努力!;-)
....
queryMode: 'local',
store: getAuthorStore(),
listeners: {
render: function(combo, options) {
var store = combo.getStore();
if (!store.loaded) {
store.load();
}
}
}