コンポーネント化する際のプロパティはinitComponentだけでは対応できない。

と、いってみます。

小堤です。

あんまり記事を書くほどしゃきっとしてないので(もうろうとしてる)ちゃかちゃかと。

題名通りですが、Ext.extendを利用して、コンポーネントを継承して、オリジナルのコンポーネントを作ろう!と、まぁ開発する人ほとんどが思うでしょう。

いや、配布するとかじゃなくても、パネルクラスをそのまま使うことはまずないですし、とりあえず継承して・・・初期設定はクラス側に記述したい・・・。

と思うわけです。

で、「初期設定はクラス側に記述したい」が大いにはまる原因です。ExtJSのワークショップにきていただいている方の中でも数人はまってました。

まず、itemsはinitComponentでExt.applyを使って設定しようなんざしちゃいけません。

itemsだけじゃないんですが、リテラル以外は設定すべきではありません。オブジェクトとか。

で、ここまでは、ワークショップでもちらほら会話にでてたのですが・・・・。

リテラルでもだめなもんはだめ。

なんですよ・・・特にレイアウトがからんでくると生じます。よく使うボーダーレイアウトがいい例。

Viewportで、ボーダーレイアウトを指定して、その中で、collapsible:trueをinitComponent内で指定してみます・・・と。

いや、設定できてるんですよ・・・だけど、開閉時おかしくなります。この現象にはまった人たくさんいるんじゃないかな?

よく、おかしくなるんでやめたとかきくし。

new するところか、xtypeを指定するオブジェクトリテラルで指定することで、問題無く動作します。

なんだかなぁと思いますが、それがいやなら、継承したときに、コンストラクタ自体を記述して、親クラスコンストラクタを呼び出すで回避できそうです。(ためしてないんで)

だけど、このやり方、コンポーネントはコンストラクタかくんじゃねぇよ。っていうのがExtJS流儀っぽいです。

なんで・・・・外側で指定する・・・がいまのところいいかなぁ・・・なんだかなぁ・・・。

時間あるときゆっくり検証しますが・・・ちなみに、これはExt JS 3.0 alphaで試した結果です。

コンポーネント化する際のプロパティはinitComponentだけでは対応できない。

2 thoughts on “コンポーネント化する際のプロパティはinitComponentだけでは対応できない。

コメントを残す