2010年2月4日木曜日

ExtJs-70 Writerのwriteイベントの解決

後記:娘は泣くし、風呂で意識うしなってぶくぶくって漫画みないなことになりつつも
きになって、もやもやしてしかたなかった昨日のwriteイベント。
ようやく完結。ぜーっ対に忘れるので残しておこう。

======
風呂でおぼれそうになりつつもすっきりしないと
今後のいろんなことのモチベーション維持にかかわるので
きょうはその機能の未解決な続きを。

createCallbackで生成されたコールバックは果たしてどこで
コールされるか。という続き。

おさらい。
execute→this.proxy.request。

httpProxy.requestにコールバックを引き渡しているので
そこから追跡。
httpProxyにrequestの実装はなく、チェーンをさかのぼって継承もとのDataProxyを追跡。

DataProxyのrequestでは
this.doRequest.apply(this, arguments);
でdoRequestをコールしてる。

ここでいうthisのスコープはhttpProxyになる。
httpProxyのdoRequestでは渡されてきた引数等(コールバック含む)オブジェクトに
設定してExt.Ajax.requestをコールしてる。
そもそもExt.AjaxはExt.data.Connectionの継承でシングルトンOBJ。

Ext.data.Connectionのrequest内で
successにme.handleresponseを設定
してExt.lib.Ajax.requestをコール。
この先はおそらく非同期通信されてさっきのme.handleresponseがよばれんだろな。
ということでいったん、ここはおいておいてme.handleresponseを。

この
handleresponseはというと。。
内部でコールバックを呼び出す。
このコールバックは
options.callback.call(options.scope, options, true, response);
このコールバックは、
実態はhttpProxyのCreateCallback内で実装されているreadじゃないときの
function。

で、
この関数のなかでアクションはreadじゃないから
this.onWrite(action, o, response, rs);
を呼び出してる。
このonWriteはまず、レスポンスを取得する。
res = reader.readResponse(action, response);
response.responseTextがあればそれをオブジェクトに代入して検証してる。
このresponse.responseTextっていうのがサーバサイドから返却した{success = true}
とかのJson文字列。

そいつを this.getRoot(o);にかけてrootを取り出すんだけど
あれ?undefine
new Ext.data.JsonReader.Error('root-undefined-response', this.meta.root);
で例外。

あああああああ!!
わかったよ。

そうか。
#metaにrootまたはrecordがないとrootがないっておこられる。
#そもそもWriterのmetaにはsuccessPropertyしか設定しなかったし。

で、rootチェックが終わったら
getSuccessでcreateAccessor(successPropertyで設定されたキーで値を取得)して
ようやくお目当てのsuccess =tureが取得ってわけだぁああああああああ。

総括して、
metaには
rootが必須。
successProtpertyは当然必須。
ってことでWriterに独自のメタを設定したんだけど、、、、、

そもそもStore生成時にReaderが上書きしちゃうので
仕方なくWrite時のサーバサイドからの返却を
Read時のJsonフォーマットと
同じ形にすることで解決。

それに伴うサーバレスポンスを返却することで解決した。
つかれたぁ。

まとめ:
Writerのmeta情報はReaderでうわがかれる。
metaにはrootが設定されていること。
そしてWriterのときのサーバサイドからの返却はのrootはemptyじゃだめ。

とっても単純な例だと、
ExtWrapper.Reader = function(config){
var meta = {
idProperty: 'id',
successProperty: 'success',
totalProperty: 'results',
root: 'rows'
};
Ext.applyIf(this, config);
ExtWrapper.Reader.superclass.constructor.call(this, meta, config );
}
Ext.extend( ExtWrapper.Reader, Ext.data.JsonReader,{
});
こんな具合でメタ設定しておいて、(ぶっちゃ毛WriterもStore内でBuildしてくれる)

サーバからは
{ 'rows':'writeresponse', 'success': true}
こんな具合のを返却したらまずは穴が開く。
そっからはメッセージなり、、と。


あー疲れた。けど満足。

0 件のコメント: