Sencha Touch 2 で Ext.tab.Panel をネストさせるときハマった
タブパネルをネストさせたかった
タブパネルって iOS の下によくあるメニューみたいなあれね。具体的には以下のようなコード。まず、ベースとなるタブパネルを定義する。
Ext.define('MyApp.view.BaseTab', { extend: 'Ext.tab.Panel', config: { // したにおく tabBarPosition: 'bottom', items: [ { // まあ xtype 指定 xtype: 'hogehoge' }, { // クラス指定でもよい xclass: 'MyApp.view.NextPanel' }, { title: 'はい', iconCls: 'info' }, { title: 'いいえ', iconCls: 'info' }, { title: 'はい', iconCls: 'info' }, ] } });
で、それを継承したようなかたちの Ext.Panel をつくる。その中で Ext.tab.Panel を使用している
Ext.define('MyApp.view.NextPanel', { extend: 'Ext.Panel', requires: [ 'Ext.dataview.List' ], config: { title: 'はい', iconCls: 'info', scrollable: true, items: [ { xtype: 'toolbar', docked: 'top', title: 'おれおれ' }, { xtype: 'label', html: 'もげもげ' }, { // ここでつかう! xtype: 'tabpanel', tabBarPosition: 'top', // これな!!!! height: 300, items: [ { title: 'はいはい', xtype: 'list', // これもな!!!! height: 300, itemTpl: '{haihaihaihai}', store: { data: [ {haihaihaihai: 'haihaihaihaimoge'}, {haihaihaihai: 'haihaihaihaihate'}, {haihaihaihai: 'togaadf'} ] } }, { title: 'いいえいいえ', xtype: 'list', // これもな!!!! height: 300, itemTpl: '{iieiieiieiie}', store: { data: [ {iieiieiieiie: 'iieiieiieiieange'}, {iieiieiieiie: 'iieiieiieiietoge'}, {iieiieiieiie: 'iieiieiieiiehage'} ] } } ] } ] } });
前回でやった「Ext.dataview.List のときは height 指定な!!!!」ってのは学習したからかいてたんだけど、どうも Ext.tab.Panel も height 指定しないと要素はあっても描画がされない。もうちょっと正確に言うと、トラブルシューティングしたときにどうもみてみると自動生成される親要素の x-dock-body が実は 0px だったから子要素がいくら 500px とか指定しても表示できないわけだ。
トラブルシューティングの軌跡
振り返ろう
- なんか表示できないよ?
- どうやら、子要素は height 指定しているから DOM の中に要素が存在している。Web Inspector でみるとどうやら要素の領域は確保されているようだ。
- なのに表示がされない。
- ということはなにか別のところがあやしい?
- まずは list じゃなくて label とか button でやってみよう
- だめだ
- ということは xtype に関係なく中身がレンダリングされてない
- ためしに label で hoge- とかいれてみる
- どうにかして Web Inspector でその文字列を表示させようとする
- なんかいろいろフォントおおきくしたり position したりしてもだめだな……
- あ!なんかこれそもそも親要素の height が 0 じゃね????
- 実際 x-dock-body を変更したら表示できた!
- ということは、親要素の問題
- tabpanel 自体に height 指定すればできた
結論
Sencha Touch 2、iOS と Android でおいしいことできるなんてそう甘いことはない