Exception... "Component returned failure code: 0x80004003の例外の解決方法。

また一つ問題が発生して解決したのでまとめておきます。

結論

こんなエラーが出たら、itemsをinitComponentメソッド内で定義してみると解決するかも。というお話。

[Exception... "Component returned failure code: 0x80004003 (NS_ERROR_INVALID_POINTER) [nsIDOMHTMLDivElement.insertBefore]"  nsresult: "0x80004003 (NS_ERROR_INVALID_POINTER)"  location: "JS frame :: http://localhost:3000/decshee/ext-4.0/src/layout/Layout.js?_dc=1317336633116 :: <TOP_LEVEL> :: line 150"  data: no]

発端

ナビゲータエリアのボタンクリックで社員情報管理タブを表示。
表示したタブを消去(×ボタン)
再度ナビゲータエリアのボタンクリック
	→タブの生成はされるが例外が発生する。
	→生成されたタブがアクティブにならない。
	→Firebugで該当タブの中身を見てみると、正常にDOMが生成されていないっぽい。
再度、表示したタブを消去(×ボタン)
再度ナビゲータエリアのボタンクリック
	→タブの生成はされ、例外も発生していない。
	→生成されたタブがアクティブになっているように見えるが、タブ内部の描画は一つ前に表示していたタブのまま。(分かりにくいなw)
	→こちらもFirebugで該当タブの中身を見てみると、やはり正常にDOMが生成されていないっぽい。

DOMがおかしくなってるっていうのは、要するにmemberlistの中が生成されていない状態でした。
"Decshee.member.view.List"が悪さをしてる感じですかね?
1発目の正常な時のDOMは正常にグリッドの行のDOMまで形成されています。

解決方法

で、2発目のときにthrowされる例外エラーの内容が、上述のエラーメッセージでした。

このエラーメッセージをGoogle先生に聞いてみるとあっさりこんな記事発見。
itemsとかをinitComponent中に記述するとうまくいくそうなのでやってみました。
今回の問題では、Decshee.member.view.(Panel|List) が相当してると思われるので、この2つを修正してみました。

結構感動したので、その時のメモから引用させて頂きます。

うおおおお!!解決した!!

該当記事によると・・・

動作の詳細までは追っかけてないので感覚的なところはありますが、
このエラーが出たときは、たいがいinitComponentに書くべき設定がなく、
レンダリングがうまくいかないってパターンでした。
例えばitems。
これは、必ずinitComponent内に記述しておかないといけない。
要は、initComponentを実行する際にitemsが存在することがポイントなので、
initComponent内に定義してもいいしそれ以前に作成できるようであればOK。
コンポーネントの拡張方法によっては、Ext.extendだけでなく、
クラス名=function()って感じにコンストラクタ作っている場合もある。
この場合はコンストラクタにitemsがあれば、initComponentの前にitemsが存在するので問題なかった。


とのこと。

てか、itemsって今まで普通にコンフィグオプションに指定していたんですが、
問答無用でinitComponent中で定義した方がイケてるってこと?
それともケースバイケース?だとしたらその判断基準は?

configオプションの反映
コンストラクタ
init?メソッド?なんてのもあったような。。
initComponentメソッド

こいつらはどういう順序で、そしてどういう意図でコールされるものなのか、という点をまったく理解してない俺。
ExtJSのソース調べなきゃ。