Backbone.jsのAjaxについて
Published at 2012-12-18
この記事はBackbone.js Advent Calendar 2012 18日目の記事です。
JavaScriptにMVCの波を巻き起こしているBackbone.js、今回はそのAjax周りについて。想像していたより、皆さん突っ込んだこと書いててどうしようと思ったけど、まぁいいや。
Backbone.jsのAjax
Backbone.jsのMVCは、ModelとCollectionにサーバーとの非同期通信関数を備えている。依存しているUnderscore.jsは配列操作などのUtility関数を提供しているが、Ajaxそのものの処理は備えていない。そこで出てくるのが、Backbone.jsはサーバーとの非同期通信をどのように行っているのかという疑問。
jQueryなどのライブラリのajax関数を使っている
10日目のエントリーBackbone.js1.0に向けての変更点 - NAVER Engineers’ Blogで紹介されているが、Backbone.jsはロード時にグローバルのjQuery / Zepto / enderのいずれかを格納する。
var $ = root.jQuery || root.Zepto || root.ender;
BackboneではBackbone.syncメソッドが通信の起点になっており、あれこれしたあと最後で$.ajax()
をコールして非同期通信を行う(もちろん$.ajax()
以外も使用されている)。Backbone.sync
はBackbone.Model
(or Backbone.Collection)で提供されるfetch()
/ save()
/ destroy()
の中で通信する際に使用される。
これは、各ライブラリの$.ajax()
のパラメータインターフェースが共通なのでこのような受け方が可能になっている。fetchなどで渡すパラメータのsuccessとerrorは、$.ajax()
のsuccessとerrorに渡される形になるっぽい。
Model.fetch() | Collection.fetch()
データの取得系の処理はこのメソッドを通して行う。
Model.save()
データの保存または更新の処理はこのメソッドを通して行う。Backbone.Collectionのcreate()はここを内部的に通る。
Model.destroy()
データの削除系の処理はこのメソッドを通して行う。
emulateHTTPとemulateJSON
リクエストヘッダのapplication/json
は、古いサーバーだと対応できない。その場合emulateJSON
をtrue
にすることで、リクエストヘッダのcontentType、application/json
をapplication/x-www-form-urlencoded
に書き換える。
また、古いサーバーだとPUT、DELETE、PATCHリクエストに対応していない場合がある。emulateHTTP
をtrue
にすることでリクエストヘッダを上書き、POSTリクエストする。その際、emulateJSON
がtrue
の場合_methodのパラメータに元のリクエストメソッドを保持する。
レガシーサーバー用なので、古いサーバーに対応する必要がない場合は、どちらもtrue
にする必要はない。
まとめ
明確なAPIラップ関数の用意と、それ以上にchange
/ destroy
/ sync
とイベントの発行に関わっている。また、underscore依存といいつつ、事実上jQueryに依存している。