sveatlo
sveatlo

Reputation: 593

ExtJS: Store loads without parameters

I'm upgrading to ExtJS 5 and can't solve this issue. I've got a function that manages everything after the login and loads store after login with the new parameters from login.

...
Ext.create('MyApp.store.MainStore').load({
        params: {
            auth: sessionStorage.authSessionId,
            hostname: sessionStorage.hostname
        },
        callback: function(records, operation, success) {
            //some callback
        }
})
...

However this loads the store, but without parameters, which causes an error on server side. My store definition:

Ext.define('MyApp.store.MainStore', {
    extend: 'Ext.data.TreeStore',
    storeId: 'MainStore',
    autoSync: false,
    autoLoad: false,

    proxy   : {
        type : 'ajax',
        url  : '/menu',
        reader: {
            type: 'json',
            rootProperty: 'children',
        },
        listeners : {
                exception : function(proxy, response, operation) {
                    //exception handling
                }
            }
    },
    fields: ['labelText','dbName','corpName','isLeaf', 'page']

});

Any suggestions? Thanks for any help.

Upvotes: 0

Views: 1076

Answers (2)

Robert Watkins
Robert Watkins

Reputation: 2206

It's a bug. If you call load on an empty TreeStore, it will load just fine, but it won't pay attention to any options you passed in, such as the parameters.

Setting a root node first allows the load to work - but then, as you've seen, you can't use it in a TreePanel (and why else would you have a TreeStore). Kind of silly, huh?

I reported this to Sencha - http://www.sencha.com/forum/showthread.php?288818-5.0.0.970-TreeStore.load()-doesn-t-call-callback-if-there-is-no-root-node.

As for workarounds:

  • you can provide the parameters by using the params configuration on the proxy. Annoying, but it does work. (Actually, extraParams might be the better choice, as it allows you to preserve the authentication token and change the main parameters if and when you use reload).
  • you can get the callback by using event handling.

BTW, because you're using autoLoad: false, you'll need to load the store at some point. Do that before you add it to the TreePanel - the only way to get a root node that works with the TreePanel seems to be to get the TreePanel to make it for you.

Upvotes: 1

Evan Trimboli
Evan Trimboli

Reputation: 30092

Try declaring a root node on your store definition.

Ext.define('MyApp.store.MainStore', {
    extend: 'Ext.data.TreeStore',
    storeId: 'MainStore',
    autoSync: false,
    autoLoad: false,

    proxy   : {
        type : 'ajax',
        url  : '/menu',
        reader: {
            type: 'json',
            rootProperty: 'children',
        },
        listeners : {
                exception : function(proxy, response, operation) {
                    //exception handling
                }
            }
    },
    fields: ['labelText','dbName','corpName','isLeaf', 'page'],
    root: {}

});

Upvotes: 1

Related Questions