Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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');
    },
like image 549
Lorenz Meyer Avatar asked Oct 25 '13 11:10

Lorenz Meyer


2 Answers

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();
    }
});
like image 191
Krzysztof Avatar answered Oct 21 '22 05:10

Krzysztof


I would let the view's controller handle the store load.

Start by disabling autoload on the store.

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

Wheter you want to change the view before or after the store is loaded is another question.

like image 35
oldwizard Avatar answered Oct 21 '22 04:10

oldwizard