2014-02-26 無題
朝から職場のトイレでもどした。出勤したのだけれど、お腹が痛いのと吐き気がひどくて「やっぱりダメだ」と思い、早退した。
家で夜まで寝て、すこし調子が戻ったように感じたので、おかゆを食べ、Backbone.jsをためす。
Collection#fetchした際に、同じデータなのに毎回addされる動きをあやしいと思い、確認したところ、Model#idAttributeの設定に誤りがあった。
Collection#fetchの動きは、簡単に表すとCollection#syncを呼び、Backbone#syncを呼び、サーバーからデータを読んで、Collection#setする。Collection#fetchで、コールバックとしてCollection#setまたはCollection#resetを呼び、あればoptions.successを呼び、そのあとsyncイベントを発火するような関数を設定している。
Collection#setではドキュメントを見るかぎり、賢くmergeすると書いてあるのだけれど、上記のように毎回addされて、ちっとも賢くないと勘違いしていた。
Collection#setを読むと答えは簡単で、Modelのid(idAttributeまたは'id')をCollection#getして存在するかを確認するので、idが正しく設定されていなければ、同じデータとして扱われない。MongoDBを使う場合はidは_idとなるので、Model#idAttributeに'_id'を設定してやれば良い。同じデータとして扱われれば、Collectionにaddするのではなく、ModelごとにModel#setが呼ばれる。
また調子が悪くなってきたので、寝る。