我正在构建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中定义
在app.js中启动功能将主视图添加到视口。
主视图创建杂志视图并将其添加到自身。
在杂志视图的初始化方法中,存储被装箱并加载。
在商店的加载侦听器中,使用控制器。
这是我的观点:
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);
}
}
}
});
答案 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中删除视图和存储,并将其放入控制器本身。我认为只有在定义了控制器后才能定义视图和存储。