如何在无需多次重新加载的情况下重用ExtJS4MVC应用程序中的存储?
我正在开发extjs4mvc应用程序 应用程序运行包含选项卡面板的视口。 每个选项卡都有自己的控制器和多个视图 看到我的沙盒了吗 我曾多次使用过一个商店(例如,topmenu组合框中的一个选项卡,clietns网格中的另一个选项卡。) 存储配置为自动加载:true。 在模型中配置了代理 我的问题是:在控制器[stores]数组中的每次提及时,存储都会被加载多次 如果我从数组[stores]控制器中删除一个,组合框将为空,尽管它的状态是store:Ext.getStore('store-ID')如何在无需多次重新加载的情况下重用ExtJS4MVC应用程序中的存储?,extjs,extjs4,extjs-mvc,reusability,extjs-stores,Extjs,Extjs4,Extjs Mvc,Reusability,Extjs Stores,我正在开发extjs4mvc应用程序 应用程序运行包含选项卡面板的视口。 每个选项卡都有自己的控制器和多个视图 看到我的沙盒了吗 我曾多次使用过一个商店(例如,topmenu组合框中的一个选项卡,clietns网格中的另一个选项卡。) 存储配置为自动加载:true。 在模型中配置了代理 我的问题是:在控制器[stores]数组中的每次提及时,存储都会被加载多次 如果我从数组[stores]控制器中删除一个,组合框将为空,尽管它的状态是store:Ext.getStore('store-ID')
请给我一个提示,或者举一个重复使用Store(而不是Model)的例子,如这里所示您可以实例化您的Store并加载它,删除自动加载
var store = Ext.create('App.store.YourStore').load();
然后将该存储区传递给所有组件,就像您希望将分页条连接到电网时所做的那样。从其他控制器调用存储区通常效果良好:
Ext.getStore('PlatformClient');
我从未尝试将同一个存储放在多个控制器stores
阵列中。我觉得这很奇怪
不过,关于您发布的代码,还有一些其他的奇怪之处,也许它们只是打字错误,也许它们对框架没有任何影响,但它们与我通常所做的不同,因此我将指出它们:
首先,“典型控制器”中的模型阵列包含一个存储:
models:[
'te.store.PlatformClient'
],
那可能只是个打字错误
其次,我没有将完整的名称空间放在我的存储阵列中,这可能没有什么不同,但我不知道。也许ExtJS在您编写的名称空间之上预先设置了名称空间,因此它认为您在初始化新控制器时实例化了不同的存储,从而导致它重新加载。例如,无论它值多少钱,这都更“正常”:
stores:[
'Taxonomy',
'PlatformClient',
'DataType'
],
controllers:[
'Taxonomies' ,
'DataType' ,
'DataSale' ,
'Clients'
],
试着像那样设置它,并去掉其他控制器存储阵列中的重复存储
另外,我想确保您了解文档中关于不需要为MVC存储定义storeId
config的内容。框架将自动为存储提供以下内容:
storeId: [StoreClassName]
因此,在您的示例中,您将自动获得:
storeId: 'PlatformClient'
其他人有,它可以追溯到框架被开发人员提供自己的带有MVC模式的
storeId
config的大胆行为震惊了。我们过去在加载方面也有类似的问题。在多次使用同一存储的情况下,也会遇到筛选问题(您可能希望在其中一个存储上设置筛选,但在另一个存储上不设置筛选)。因此,我们在应用程序启动时加载所有存储。然后,无论何时我们需要该存储用于显示目的,我们都将其克隆到内存中,使用ha实用程序函数,而不是使用原始存储,如下所示
/**
* Use this for example if you want to apply a filter on a store
* but you dont want the original store to change, so:
* singleton store has no filter
* you clone it to be used with filters in some places.
*
* Note: this will have memory proxy, so no changes to the stores are persistent,
* changes will have no effect on the local/remote db.
*
*/
createStore: function(storeId, data) {
//
// Creates a new store from the given array of records without
// registering the new store.
// See cloneStore for more info
//
var modelName = storeId;
var prevStore = Ext.getStore(storeId);
data = data || prevStore.data.all;
var clonedStore = Ext.create('App.store.' + storeId, {
data: data,
model: 'App.model.' + modelName,
proxy: 'memory'
});
Ext.data.StoreManager.register( prevStore );
return clonedStore;
}
请注意,克隆副本正在使用内存代理。因此,不应该对其执行写操作。如果需要更新存储,请始终使用原始存储
我希望这在某种程度上有所帮助。发布您的代码将帮助我们更轻松地诊断此问题。@Lev,您有解决方案吗?我目前陷入了这个问题,下面的答案与存储加载有关,但我怀疑这个问题与模型关联和多个存储有关。除非我需要在控制器中手动设置独立于对象图的存储和调用过滤器,否则显示主数据不是直接的。希望有一天你能在这里发布关于修复的评论。我曾在Ext.application.launch()--------------存储区加载了一次,但网格和组合框都是空的1
te.store.PlatformClient
是一种类型,是的!2.我把代码放在这里了。请看一看