EagleLand

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.syncBackbone.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は、古いサーバーだと対応できない。その場合emulateJSONtrueにすることで、リクエストヘッダのcontentType、application/jsonapplication/x-www-form-urlencodedに書き換える。

また、古いサーバーだとPUT、DELETE、PATCHリクエストに対応していない場合がある。emulateHTTPtrueにすることでリクエストヘッダを上書き、POSTリクエストする。その際、emulateJSONtrueの場合_methodのパラメータに元のリクエストメソッドを保持する。

レガシーサーバー用なので、古いサーバーに対応する必要がない場合は、どちらもtrueにする必要はない。

まとめ

明確なAPIラップ関数の用意と、それ以上にchange / destroy / syncとイベントの発行に関わっている。また、underscore依存といいつつ、事実上jQueryに依存している。

タイトルと URL をコピーしました