extjs - Store with autoload true should not load on application launch

Lorenz Meyer picture Lorenz Meyer · Oct 25, 2013 · Viewed 28.2k times · Source

I have a grid linked to a store with autoLoad: true. The problem is that the store gets loaded on application launch, even if the view is created only later when accessed through a menu.

I have referenced the store in Application.js and in the view, but I'm not instatiating explicitly neither the store nor the view.

I don't know how to achieve that the store is loaded only when needed by the view.

  • If I set autoLoad: true, the store gets loaded on application launch.
  • If I set autoLoad: false, the store doesn't get loaded at all.

I know this is pretty basic, but I'm stuck so far.


Here is all the relevant code for reference:
app/store/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'
    ],
    ...

app/view/Owners.js

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

The view is instantiated in the controller:

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');
    },

Answer

Krzysztof picture Krzysztof · Oct 25, 2013

You can add render handler to view which will call store load method and disable autoLoad.

Example listener:

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();
    }
});