Sencha Touch MVC 中 store 的使用



I have a UserStore that I want to load after succesful login of a user. I can't get this to work i.e. find a pattern to do this.

I now have the UserStore in the app.js like this:

stores : ['UserStore']

The store

Ext.define('MyApp.store.UserStore', {
extend : 'Ext.data.Store',
xtype : 'userstore',
config : {
    model : 'MyApp.model.User',
    autoLoad : true,
    proxy : {
        type : 'ajax',
        url : 'php/get_user.php',
        reader : {
            type : 'json',
            rootProperty : 'users'
        }
    },
    listeners : {
        beforeload : function() {
            console.log('Before load');
        },
        load : function(store) {
            console.log('load');
        }
    }
}
});

The user is retrieved based on the php $_SESSION['userid'] which is not set before a user is loggedin.

When starting up the app the store is loaded but it doesn't find any data. I need to go back to the beginning to log in again and then of course the session id was set in the previous login.

What I am trying to accomplish is either to lazy load the store or to autoload only when needed by the View.

I have tried this but I can't get it to work.

This is what I did:

option 1

I removed the UserStore from app.js and added a require and xtype item to the View but then I get [WARN][Ext.dataview.DataView#applyStore] The specified Store cannot be found

The View

Ext.define('MyApp.view.Profile', {
extend : 'Ext.Panel',
xtype : 'profileview',

requires : ['MyApp.store.UserStore', 'Ext.List', 'Ext.DataView', 'Ext.data.Store'],

config : {
    layout : 'fit',
    title : 'Profiel',
    iconCls : 'user3',
    cls : 'home',
    scrollable : true,
    styleHtmlContent : true,
    html : ['<h1>Mijn Profiel</h1>'].join(""),
    items : [Ext.create('Ext.DataView', {
        store : 'userstore',
        itemTpl : '<h2>{USERNAME}</h2><p>{EMAIL}</p>'
    })]
}
});

Option 2

try to find out if I can set the autoload to false and load in on demand via some listener. But I can't find out exactly how.

So, how can this be achieved and what is the best pattern to do this.

Thanks for your help! Ext.dataview.DataView#applyStore The specified Store cannot be found

 

up vote3 down vote accepted

I actually never assign stores this way: store : 'userstore'. A better way is to create an instance of the store and load it yourself, using the autoLoad: false on my stores, I don't like them loading at start of the app. Try this (I can't test it because I'm not usually programming touch apps).

Ext.define('MyApp.view.Profile', {
    extend: 'Ext.Panel',
    xtype: 'profileview',

    requires: ['MyApp.store.UserStore', 'Ext.List', 'Ext.DataView', 'Ext.data.Store'],

    config: {
        layout: 'fit',
        title: 'Profiel',
        iconCls: 'user3',
        cls: 'home',
        scrollable: true,
        styleHtmlContent: true,
        html: ['<h1>Mijn Profiel</h1>'].join("")
    },

    initialize: function () {
        var me = this;

        //Create the instance of the store and load it
        var userStore = Ext.create('MyApp.store.UserStore');
        userStore.load();

        //Create the dataview
        var view = Ext.create('Ext.DataView', {
            store: userStore,
            itemTpl: '<h2>{USERNAME}</h2><p>{EMAIL}</p>'
        });
        //Add the dataview to the panel
        me.add(view);
    }
});






关注公众号,分享干货,讨论技术


posted on   EvanLong  阅读(182)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示