4

所以我有panel(让我们称之为fooPanel)包含一个grid(让我们称之为 if fooGrid,其中有一些store)。fooPanel可以插入一些tabpanel。所以问题是,可以tabpanel包含两个(或更多) 的实例fooPanel,并带有一些不同的参数。我认为这里的问题很明显。由于fooGrids面板上的内容相同stores,因此一旦我重新加载一个商店,两者fooGrids都将被重新加载。(因为他们有相同的stores)。有针对这个的解决方法吗?或者我应该限制用户只打开一个实例fooPanelpertabpanel

4

3 回答 3

8

除了每个网格创建一个商店之外,没有简单的解决方案。如果您不想创建多个商店实例的原因是为了避免多次加载,您可以在代理级别破解某种缓存。

编辑如何为您的网格创建多个商店的示例

您可以在您的网格方法中自己创建商店实例(即使用Ext.create('My.Store')) :initComponent

Ext.define('My.Store', {
    extend: 'Ext.data.Store'
    ,fields: ['name']
    ,proxy: {
        type: 'memory'
        ,reader: 'array'
    }
    ,data: [['Foo'],['Bar'],['Baz']]
});

Ext.define('My.Grid', {
    extend: 'Ext.grid.Panel'

    ,columns: [{dataIndex: 'name'}]

    ,initComponent: function() {
        // /!\ Do that BEFORE calling parent method
        if (!this.store) {
            this.store = Ext.create('My.Store');
        }

        // ... but don't forget to call parent method            
        this.callParent(arguments);
    }
});

// Then I can create multiple grids, they will have their own store instances

Ext.create('My.Grid', {
    renderTo: Ext.getBody()
    ,height: 200
});

Ext.create('My.Grid', {
    renderTo: Ext.getBody()
    ,height: 200
});

或者您可以在创建时指定一个新的商店实例:

Ext.create('Ext.grid.Panel', {
    renderTo: Ext.getBody()
    ,height: 200
    ,columns: [{dataIndex: 'name'}]
    ,store: Ext.create('My.Store') // one instance
});

Ext.create('Ext.grid.Panel', {
    renderTo: Ext.getBody()
    ,height: 200
    ,columns: [{dataIndex: 'name'}]
    ,store: Ext.create('My.Store') // two instances!
});

但是,就我而言,我通常不会费心创建完整的商店定义。我在模型中配置代理,并使用该模型使用内联存储配置(内联配置将变成它们自己的实例,在 Ext4 中)。例子:

Ext.define('My.Grid', {
    extend: 'Ext.grid.Panel'

    ,columns: [{dataIndex: 'name'}]

    // inline store configuration
    ,store: {
        // The model takes care of the fields & proxy definition
        model: 'My.Model'

        // other params (like remoteSort, etc.)
    }
});

// Now I can create plenty of My.Grid again, that won't interfere with each other
于 2013-07-26T12:07:14.373 回答
2

在 ExtJS 5 中,您可以利用 Chained Stores。这样,您就可以拥有一个源商店,而其他商店则使用不同的过滤器查看同一家商店。

http://docs.sencha.com/extjs/5.0.0/whats_new/5.0/whats_new.html

http://extjs.eu/on-chained-stores/

于 2014-07-15T18:22:46.060 回答
1

这篇文章可能对你有所帮助

Ext.define('App.store.MyStore', {
    extend : 'Ext.data.Store',
    alias  : 'store.app-mystore', // create store alias

    // ... 
}); 

Ext.define('App.view.MyCombo', {
    extend : 'Ext.form.field.ComboBox',
    xtype  : 'app-mycombo',

   requires : [
       'App.store.myStore'
   ],

   // combo config
   store : {
       type : 'app-mystore' // store alias; type creates new instance
   }
});

http://www.sencha.com/forum/showthread.php?284388-ExtJs-4.2-Multiple-instances-of-the-same-Store&p=1040251

于 2014-04-17T08:54:47.270 回答