如何在没有多次重载的情况下重用EXT JS 4 MVC应用程序中的存储?

时间:2012-08-23 13:26:35

标签: extjs extjs4 extjs-mvc reusability extjs-stores

我正在研究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

3 个答案:

答案 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;

}

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

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