Sencha touch 2.1 アプリケーションをビルドしています。
私のアプリケーションには、コントローラ クラスの参照を保持する 1 つのグローバル変数があります。この参照は、ストアの 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);
}
}
コントローラーの init メソッドの代わりに app.js launch() メソッドでこの変数を初期化しようとしましたが、それも機能しませんでした。
コードをローカルのApacheに配置し、Chromeブラウザーを使用してアクセスすると、両方のアプローチが正常に機能しますが、低速のリモートサーバーに配置すると機能しないことに注意してください。
編集
これがアプリケーション フローの仕組みです。0. すべてのモデル、ビュー、ストア、およびコントローラーは app.js で定義されます。
app.js の Launch 関数は、ビューポートにメイン ビューを追加します。
メイン ビューはマガジン ビューを作成し、それを自身に追加します。
マガジンビューの初期化メソッドで、ストアをクレートしてロードします。
ストアのロードリスナーではコントローラーを使用しています。
これは私の見解です:
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);
}
}
}
});