2

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

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

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

在控制器的 init 方法中,但在调用此 init 之前加载了视图和存储,因此我收到此错误:

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. 在商店的加载监听器中,使用了控制器。

这是我的看法:

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

4 回答 4

1

您的示例代码中缺少一些部分,因此只是提示/猜测。我猜您的商店具有autoLoadtrue 属性,因此在初始化后立即加载。关闭它并尝试这样的事情。

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

或者提供有关商店、加载者、加载时间和范围的更多信息。

于 2012-12-20T12:47:01.100 回答
0

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

就像是:

//in controller
init: function() {
    myStore.load({
        callback: function(recs, op, success) {
            // do the load magazines thing
        }
    })
}
于 2012-12-20T13:04:16.023 回答
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) {
    }
});
于 2012-12-21T11:21:24.800 回答
0

我很好奇我在这里建议的内容:getController() 不会加载文件,也不会触发 init,而 lauch对此也有帮助。您可以从 app.js 中删除视图和存储并将其放入控制器本身。我认为应该只在定义控制器之后才定义视图和存储。

于 2014-06-17T21:09:43.850 回答