Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在无需多次重新加载的情况下重用ExtJS4MVC应用程序中的存储?_Extjs_Extjs4_Extjs Mvc_Reusability_Extjs Stores - Fatal编程技术网

如何在无需多次重新加载的情况下重用ExtJS4MVC应用程序中的存储?

如何在无需多次重新加载的情况下重用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')

我正在开发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.我把代码放在这里了。请看一看