日々精進

新しく学んだことを書き留めていきます

Extjs どこでstoreのloadイベントにコールバック関数を渡すか

MVCパターンを使って開発してるとMVCがきれいに分離されて構造が良くなるのはいいんだけど、各メソッドの呼び出し順序は不明瞭になる。
今回も呼び出し順序でちょっとはまったのでメモ。


やりたいこと:
storeのloadイベントにコールバック関数を渡す。
Webページの初期化時にloadが実行されるが、その際にコールバック関数を実行させる。


結論:
Storeの定義の中でlistenersプロパティに直接匿名関数を渡そう!

Ext.define('Real.store.DiscountPatterns', {
    extend: 'Ext.data.Store',
    ・・・
    listeners: {
    	load: {
    		fn: function(store, records, options) {
		    	・・・
    		}
    	}
    }
});



やったこと:
・イベントにコールバック関数を渡すと言ったらコントローラのinitプロパティだよねということでそこで渡してみる。
→コールバックが実行されない。
原因はstoreがloadした後でコントローラのinitプロパティに渡された匿名関数が実行されるため。そういう順番なんだ。。


・じゃあdefineの第三引数に匿名関数を渡すと定義後に実行してくれる機能を使おう
→Ext.getStore('・・・')でStoreクラスを取得出来ない
Storeを定義した後だけど、StoreManagerにStoreを登録する前だもんね。。どっかに定義したクラス全部が保持されてるんだろうけど、そこから参照持ってくるより素直な方法で実装したい。


・じゃあlistenersでloadにthis.onLoadを渡そう
→thisがグローバルスコープになってる

Ext.define('Real.store.DiscountPatterns', {
    ・・・
    listeners: {
    	load: this.onLoad //thisがwindowオブジェクトになってるのでonLoadはundefined
    },
    onLoad: function(){・・・}
});

こういうコードでload:にonLoad関数を渡すのどうやるの。。


・しょうがないのでloadに直接匿名関数を渡す。
listenerが多くなってきた時に見通しが悪くなるのでできれば他のところで関数を定義したいな。。まあでもあんまし変わらないか。


一度MVCパターン適用時の実行順について整理しときたいなー。