blog.bouzuya.net

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が呼ばれる。

また調子が悪くなってきたので、寝る。