5

我正在开发 extjs 4 MVC 应用程序。

应用程序运行包含选项卡面板的视口。每个选项卡都有自己的控制器和多个视图。

在http://wap7.ru/folio/ext-reuseable-store/TE.html查看我的沙箱

我有一个商店多次使用(例如,顶部菜单组合框中的一个选项卡,另一个在客户端网格中。)使用自动加载配置的商店:true。代理在模型中配置。

我的问题: Store 被多次加载 - 在控制器 [stores] 数组中的每一次提及。

如果我从数组 [stores] 控制器中删除一个 - 组合框将为空,尽管它声明 store: Ext.getStore ('STORE-ID')

请给我一个提示,或者一个重用商店(不是模型)的例子,如这里http://docs.sencha.com/ext-js/4-0/#!/guide/mvc_pt2

4

3 回答 3

1

您可以实例化您的商店并加载它,删除自动加载。

var store = Ext.create('App.store.YourStore').load();

然后将该存储传递给您的所有组件,就像您希望将分页栏连接到网格时所做的那样。

于 2012-08-23T13:32:59.990 回答
0

这通常可以很好地从其他控制器调用您的商店:

Ext.getStore('PlatformClient');

我从未尝试将同一个商店放在多个控制器stores阵列中。这对我来说似乎很奇怪。

不过,您发布的代码还有其他一些奇怪之处,也许它们只是拼写错误,也许它们对框架没有任何影响,但它们与我通常所做的不同,所以我会指出它们:

首先,“典型控制器”中的模型数组包含一个商店:

models:[
'te.store.PlatformClient'

],

那一个可能只是一个错字。

其次,我没有将完整的命名空间放在我的存储数组中,这可能没有什么不同,但我不知道。也许 ExtJS 在您写出的名称空间之上添加了名称空间,因此它认为您在初始化新控制器时正在实例化不同的存储 - 从而导致它重新加载。例如,无论它值多少钱,这都更“正常”:

stores:[
    'Taxonomy',
    'PlatformClient',
    'DataType'
],
controllers:[
    'Taxonomies' ,
    'DataType' ,
    'DataSale' ,
    'Clients' 
],

尝试像这样设置它并摆脱其他控制器存储阵列中的重复存储。

另外,我想确保您在文档中了解到不需要storeId为 MVC 商店定义配置。该框架将自动为商店提供以下信息:

storeId: [StoreClassName] 

所以在你的例子中,你会自动得到这个:

storeId: 'PlatformClient'

最近有人在使用 MVC 商店时遇到了麻烦,这可以追溯到框架被开发人员大胆地storeId使用 MVC 模式提供他们自己的配置而大吃一惊。

于 2012-08-23T16:00:15.783 回答
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;

}

请注意,克隆的副本正在使用内存代理。因此不应对其进行写操作。如果您需要更新商店,请始终使用原始商店。

我希望这在某种程度上有所帮助。

于 2014-07-03T13:11:42.540 回答