2013-10-25 35 views
7

我有一個網格鏈接到與autoLoad: true的商店。問題在於,應用程序啓動時存儲會被加載,即使稍後通過菜單訪問時創建視圖也是如此。extjs - 應用程序啓動時不應加載自動加載的真實存儲

我已經在Application.js中和視圖中引用了商店,但我並沒有明確表示商店和視圖。

我不知道如何實現該商店只在視圖需要時加載。

  • 如果我設置autoLoad: true,商店被裝載在應用程序啓動。
  • 如果我設置了autoLoad: false,則該商店根本不會被加載。

我知道這是非常基本的,但我堅持到目前爲止。


這裏是所有參考相關的代碼:
應用程序/商店/ Owners.js

Ext.define('Mb.store.Owners', { 
    extend: 'Ext.data.Store', 
    model: 'Mb.model.Owner', 
    autoLoad: true, 
    proxy: { 
     ... 
}); 

的application.js

Ext.define('Mb.Application', { 
    name: 'Mb', 
    extend: 'Ext.app.Application', 
    models: [ 
     'Owner' 
    ], 
    stores: [ 
     'Owners' 
    ], 
    ... 

應用程序/視圖/ Owners.js

Ext.define('Mb.view.winbiz.Owners', { 
    extend: 'Ext.grid.Panel', 
    alias: 'widget.test-gridPanel', 
    store: 'winbiz.Owners', 
    columns: [{ 
    ... 

視圖被實例化控制器:

Ext.define('Mb.controller.Winbiz', { 
    extend: 'Ext.app.Controller', 
    views: [ 
     'Owners' 
    ], 
    init: function(){ 
     this.control({ 
      'menu #test': {click: this.onMenuTest}, 
     }) 
    }, 
    onMenuTest: function(){ 
     this.getController('Main').addToMainTab('test-gridPanel'); 
    }, 

回答

6

您可以添加render處理程序,查看,這將調用儲存load方法和禁用autoLoad

例聽者:

Ext.define('Mb.view.winbiz.Owners', { 
    extend: 'Ext.grid.Panel', 
    [...], 

    initComponent: function(){ 
     this.callParent(); 
     this.on('render', this.loadStore, this); 
    }, 

    loadStore: function() { 
     this.getStore().load(); 
    } 
}); 
+0

謝謝,這是一個完美的解決方案。 –

+4

我不喜歡在視圖中的代碼。如果代碼在視圖中應該是控制器的責任,那麼沒有理由使用控制器。該解決方案還會在視圖的每個渲染上重新加載商店 - 可能不必要? – oldwizard

1

予先給視圖的控制器處理該存儲負載。

首先禁用商店的自動加載。

Ext.define('Mb.controller.Winbiz', { 
    extend: 'Ext.app.Controller', 
    views: [ 
     'Owners' 
    ], 
    ownerStore: null, 
    init: function(){ 
     this.control({ 
      'menu #test': {click: this.onMenuTest}, 
     }); 

     this.ownerStore = Ext.getStore('winbiz.Owners'); 
    }, 
    onMenuTest: function() { 
     if (this.ownerStore.loaded === false) { 
      this.ownerStore.load(
       scope: this, 
       callback: this.onOwnerStoreLoaded 
      ); 
     } 
     else { 
      this.addToTab(); 
     }    
    }, 
    onOwnerStoreLoaded: function (store, records, successful, eOpts) { 
     if (successful) { 
      store.loaded = true; 
      this.addToTab(); 
     } 
    }, 
    addToTab: function() { 
     this.getController('Main').addToMainTab('test-gridPanel'); 
    } 

在加載商店之前或之後你想改變視圖的是另一個問題。

+0

你說得對,代碼應該進入控制器,不應該重新加載商店。你的代碼有點兒長。我會盡量縮短它。 –

0

這是我最後的控制器代碼:

Ext.define('Mb.controller.Winbiz', { 
    extend: 'Ext.app.Controller', 
    views: [ 
     'Owners' 
    ], 
    refs: [{ref: 'testGrid', selector: 'test-gridPanel'}], 
    init: function(){ 
     this.listen({ 
      store: { 
       '#Owners':{ load: this.onOwnersLoad} 
      } 
     }) 
     this.control({ 
      'menu #test': {click: this.onMenuTest}, 
      'test-gridPanel': {render: this.onOwnersRender} 
     }) 
    }, 
    onMenuTest: function(){ 
     this.getController('Main').addToMainTab('test-gridPanel'); 
    }, 
    onOwnersLoad: function(store){ 
     store.loaded = true 
    }, 
    onOwnersRender: function(){ 
     var store = this.getTestGrid().getStore(); 
     if(!store.loaded)store.load(); 
    }, 

它把所有的代碼到控制器的建議通過@pcguru並使用渲染事件以縮短代碼由@Lolo的建議。謝謝

+0

'.loaded'未在您的代碼中設置,它將始終加載商店。 – oldwizard

+0

@pcguru你說得對。所以這意味着如果商店已經加載,除非將商店存儲在商店加載的變量中,否則無法知道商店是否已加載? –

+1

@pcguru我更新了我的代碼以解決此問題。現在它不比你的短:( –

相關問題