【问题标题】:How to reuse store in EXT JS 4 MVC application without multiple reloading?如何在不多次重新加载的情况下重用 EXT JS 4 MVC 应用程序中的存储?
【发布时间】:2012-08-19 00:43:45
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

  • 发布您的代码将帮助我们更轻松地诊断此问题。
  • @Lev,你有解决办法吗?我目前陷入了这个问题,下面的答案与商店加载有关,但我怀疑这个问题与模型关联和多个商店有关。除非我需要独立于对象图的存储并在控制器中手动调用过滤器,否则显示主数据并不简单。
  • 不是真的。希望有一天你会在这里发表评论。

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


【解决方案1】:

我们曾经在加载时遇到过类似的问题。在多次使用同一个商店的情况下也会出现过滤问题(您可能希望在一个上设置过滤器,而不是在另一个上)。因此,我们在应用程序启动时加载所有商店。然后,每当我们需要该存储用于显示目的时,我们将使用 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;

}

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

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

【讨论】:

    【解决方案2】:

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

    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,它可以追溯到框架被开发人员提供他们自己的带有 MVC 模式的 storeId 配置的大胆所震惊。

    【讨论】:

    • 1. te.store.PlatformClient 是一种类型,是的! 2.
    • 我把我的代码放在这里。 link请看一下
    【解决方案3】:

    您可以只实例化您的商店并加载它,然后移除自动加载。

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

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

    【讨论】:

    • 我试图在 Ext.application.launch() 中做到这一点 --------------- 商店已加载一次,但网格和组合框都是空的跨度>
    猜你喜欢
    • 1970-01-01
    • 2019-12-15
    • 1970-01-01
    • 2017-08-13
    • 2012-12-02
    • 2014-07-21
    • 1970-01-01
    • 2021-11-15
    • 2019-03-14
    相关资源
    最近更新 更多