2013-07-26 61 views
3

所以我panel(可以稱之爲fooPanel)含有grid(讓我們稱之爲如果fooGrid,其中有一些store)。 fooPanel可以插入一些tabpanel。所以問題是,tabpanel可能包含兩個(或更多)fooPanel的實例,並帶有一些不同的參數。我認爲這個問題很明顯。因爲面板上的fooGrids具有相同的stores,只要我重新加載一個商店,兩個fooGrids正在重新加載。 (因爲他們有相同的stores)。有針對這個的解決方法嗎?或者我應該限制用戶只打開一個fooPanel的實例,每tabpanel問題與同一家商店格Ext JS的

+0

是否有你需要更多的情況下,任何的理由?如果是這樣,只需更改每個實例的商店 – sra

+0

是的,這是有原因的。我如何'爲每個實例更改商店'? – Dimitri

回答

7

除了每個網格創建一個商店之外,沒有簡單的解決方案。如果您不想創建商店的多個實例的原因是爲了避免多次加載,您可以在代理級別上進行某種緩存。

編輯如何創建多個商店爲您的網格實例

您可以創建存儲實例(即使用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 
+0

網格有一個屬性商店權利?並且我實例化的每個面板都將具有相同網格的實例,它本身將具有相同的商店。我可以針對同一個網格的不同實例擁有相同商店的不同實例嗎?數據存儲由ASP.NET以JSON格式提供。你能否提供一些代碼來展示爲不同的網格實例創建不同的商店實例的例子? – Dimitri

+0

有很多方法可以實現這一點。我在我的答案中添加了一些示例,希望能夠匹配您的用例。 – rixo

+0

@rixo感謝聯機商店的建議 - 這似乎是一個更好的方法來做到這一點。 – Mark

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