我正在研究extjs 4 MVC应用程序。
应用程序运行包含tabpanel的Viewport。 每个选项卡都有自己的控制器和多个视图。
在http://wap7.ru/folio/ext-reuseable-store/TE.html
查看我的沙盒我有一个商店多次使用过(例如topmenu组合框中的一个标签,另一个在clietns网格中。) 使用自动加载配置的存储:true。 代理在模型中配置。
我的问题:Store多次加载 - 在控制器[stores]数组中每次提及。
如果我从数组中删除一个[stores] controller- combobox将为空,尽管它表示store:Ext.getStore('STORE-ID')
请给我一个提示,或者重新使用商店(不是模特)的例子,如http://docs.sencha.com/ext-js/4-0/#!/guide/mvc_pt2
答案 0 :(得分:1)
您可以实例化您的商店并加载它,删除自动加载。
var store = Ext.create('App.store.YourStore').load();
然后将该商店传递给您的所有组件,就像您希望将分页栏连接到网格时那样。
答案 1 :(得分:0)
这通常适用于从其他控制器调用您的商店:
Ext.getStore('PlatformClient');
我从未尝试将同一个商店放在多个控制器stores
数组中。这对我来说很奇怪。
关于您发布的代码还有其他一些奇怪之处,也许它们只是错别字,也许它们对框架没有任何影响,但它们与我通常所做的不同,所以我会指出他们:
首先,“典型控制器”中的模型数组包含商店:
models:[
'te.store.PlatformClient'
],
那可能只是一个错字。
其次,我没有将完整的命名空间放在我的商店数组中,这可能没有什么区别,但我不知道。也许ExtJS在您编写的命名空间之上添加名称空间,因此它认为您在初始化新控制器时实例化不同的存储 - 从而导致重新加载。例如,无论它的价值如何,这都是“正常的”:
stores:[
'Taxonomy',
'PlatformClient',
'DataType'
],
controllers:[
'Taxonomies' ,
'DataType' ,
'DataSale' ,
'Clients'
],
尝试像这样设置它并摆脱其他控制器存储阵列中的重复存储。
另外,我想确保您在文档中了解了不需要为MVC存储定义storeId
配置。该框架将自动为商店提供:
storeId: [StoreClassName]
因此,在您的示例中,您将自动获得此信息:
storeId: 'PlatformClient'
其他人有trouble with MVC stores recently,它追溯到框架,被开发者的大胆提供了他们自己的storeId
配置MVC模式。
答案 2 :(得分:0)
我们过去常常遇到类似的问题。如果多次使用同一个商店,也会出现过滤问题(您可能希望在一个商店上设置过滤器而在另一个商店上设置过滤器)。因此,我们在应用程序启动时加载所有商店。然后,每当我们需要该存储用于显示目的时,我们将使用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;
}
请注意克隆的副本正在使用内存代理。因此,不应该对其进行写操作。如果您需要更新商店,请始终使用原始商品。
我希望这在某种程度上有所帮助。