查看&在控制器初始化之前加载的存储

时间:2012-12-20 12:37:36

标签: javascript extjs sencha-touch sencha-touch-2

我正在构建Sencha touch 2.1应用程序。

在我的应用程序中,我有一个全局变量,它保留了我的控制器类的引用。此引用用于在其中一个存储的加载时执行控制器功能,但是当我在慢速远程服务器上部署它时会出现问题,并且在此全局变量获取控制器对象的引用之前会触发存储的加载。为了在商店加载之前提供这个引用,我尝试将初始化逻辑放在控制器init方法

init : function(){
    bossController = this.getApplication().getController('Boss');
},

在控制器的init方法中但是查看&在调用此init之前加载store,因此我收到此错误:

Cannot call method 'loadMagazines' of undefined 

这是我在商店中的加载侦听器:

listeners:{
        load: function( me, records, successful, operation, eOpts ){ 
            bossController.loadMagazines(this, records);
        }
}

我尝试在app.js的launch()方法中初始化这个变量而不是控制器的init方法,但这也没有用。

请注意,当我将代码放入本地apache并使用我的Chrome浏览器访问它时,这两种方法都能正常工作,但是当我把它放在慢速远程服务器上时它们不起作用。

修改

这就是应用程序流的发生方式  0.所有型号,视图,商店和控制器在app.js中定义

  1. 在app.js中启动功能将主视图添加到视口。

  2. 主视图创建杂志视图并将其添加到自身。

  3. 在杂志视图的初始化方法中,存储被装箱并加载。

  4. 在商店的加载侦听器中,使用控制器。

  5. 这是我的观点:

    Ext.define('myshop.view.MagazinePanel', {
    extend : 'Ext.Panel',
    requires : [ 
        'myshop.model.MagazinePage',
        'myshop.store.MagazineStore',
        'Ext.XTemplate',
        'Ext.data.Store'
    ],
    alias : 'widget.magazinepanelview',
    xtype : 'magazinepanelview',
    config : {
        layout : 'hbox',
        id : 'hc',
        scrollable: 'horizontal',
        directionLock : true,
        masked: {
            xtype: 'loadmask',
            message: 'Loading'
        },
    inline: {
            wrap: false
        },
        items : [{
            xtype : 'panel',
            html : ''
        }]
    },
    initialize: function() {
        var me = this;
        var myStore = Ext.create('myshop.store.MagazineStore');
            myStore.load({
                callback: function(records, operation, success) {
                    me.setMasked(false);
                },
                scope: this
            });
        this.callParent();
    }
    });
    

    这是商店:

    Ext.define('myshop.store.MagazineStore',{
    extend:'Ext.data.Store',
    requires: [
               'myshop.model.MagazinePage',
               'Ext.data.proxy.JsonP'
           ],
    config:{
        storeId : 'ms',
        model:'myshop.model.MagazinePage',
        autoLoad :false,
        pageSize: 30,
        proxy : {
            type: 'jsonp',
            url: Properties.PORTAL_SERVICE_BASE_URL+'test/categories/list',
            callbackKey: 'callback',
            startParam: false, //to remove param "start" and making it constant
            extraParams: {
                start : 0,
                _type : 'json'
            },
            reader: {
                type: 'json',
                rootProperty: 'categories.data',
                totalProperty: 'categories.status.totalCount'
            }
        },
        listeners:{
            load: function( me, records, successful, operation, eOpts ){ 
                bossController.loadMagazines(this, records);
            }
        }
    }
    });
    

4 个答案:

答案 0 :(得分:1)

您的示例代码中缺少某些部分,因此只是一个提示/猜测。我猜你的商店有autoLoad属性为true,因此一旦初始化就会加载。转过来尝试这样的事情。

init : function(){
    bossController = this.getApplication().getController('Boss'); // bossController where is this var defined? 
    // fire a ready event
    // or
    Ext.StoreMgr.lookup('YourStoreName').load();
}

或者提供有关商店,加载商店,加载时间以及在哪个范围内的更多信息。

答案 1 :(得分:0)

难道你不能将loadMagazines函数放入控制器中显式load()函数的成功回调中,并按@sra建议禁用autoLoad吗?

类似的东西:

//in controller
init: function() {
    myStore.load({
        callback: function(recs, op, success) {
            // do the load magazines thing
        }
    })
}

答案 2 :(得分:0)

加载数据应该是控制器而不是视图。

   Ext.define("myshop.controller.Boss", {
    extend: 'Ext.app.Controller',

    config: {
        refs: {
            magazinePanel: '#hc'
        },
        control: {
            magazinePanel: {
                initialize: 'initializeMagazinePanel'
            }
        }
    },

    initializeMagazinePanel: function() {
        var me = this;
        var myStore = Ext.create('myshop.store.MagazineStore', {
            listeners:{
                scope: this,
                load: this.onMagazineStoreLoad
            }
        });
        myStore.load();
    },

    onMagazineStoreLoad: function(me, records, successful, operation, eOpts) {
        this.getMagazinePanel().setMasked(false);
        this.loadMagazines(records)
    },

    loadMagazines: function(records) {
    }
});

答案 3 :(得分:0)

我很好奇我在这里建议的内容:getController() doesn't load file and doesn't fire init and lauch也有助于此。您可以从app.js中删除视图和存储,并将其放入控制器本身。我认为只有在定义了控制器后才能定义视图和存储。