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
が呼ばれる。
また調子が悪くなってきたので、寝る。