## Backbone.sync(同步)
**Backbone.sync** 是 Backbone 每次向服務器讀取或保存模型時都要調用執行的函數。 默認情況下,它使用 `jQuery.ajax` 方法發送 RESTful json 請求,并且返回一個 [jqXHR](http://www.css88.com/jqapi-1.9/jQuery.ajax/#jqXHR)。 如果想采用不同的持久化方案,比如 WebSockets, XML, 或 Local Storage,我們可以重載該函數。
**Backbone.sync** 的語法為 `sync(method, model, [options])`。
* **method** – CRUD 方法 (`"create"`, `"read"`, `"update"`, or `"delete"`)
* **model** – 要被保存的模型(或要被讀取的集合)
* **options** – 成功和失敗的回調函數,以及所有 jQuery 請求支持的選項
默認情況下,當 **Backbone.sync** 發送請求以保存模型時,其屬性會被序列化為 JSON,并以 `application/json` 的內容類型發送。 當接收到來自服務器的 JSON 響應后,對經過服務器改變的模型進行拆解,然后在客戶端更新。 當 `"read"` 請求從服務器端響應一個集合([Collection#fetch](#Collection#fetch))時,便拆解模型屬性對象的數組。
當一個模型或集合開始 **sync**到服務器時,將觸發一個 `"request"` 事件。 如果請求成功完成,你會得到一個`"sync"`事件, 如果請求失敗,你會得到一個 `"error"`事件。
**sync**函數可重寫為全局性的`Backbone.sync`, 或在細粒度級別, 通過添加一個 `sync`函數 到Backbone集合或單個模型時。
默認 **sync** 映射 REST 風格的 CRUD 類似下面這樣:
* **create → POST ?** `/collection`
* **read → GET ?** `/collection[/id]`
* **update → PUT ?** `/collection/id`
* **patch → PATCH ?** `/collection/id`
* **delete → DELETE ?** `/collection/id`
舉個例子,一個Rail 4 處理程序響應一個來自`Backbone`的`"update"`調用,可能是這樣的: _(在真正的代碼中, 千萬不要盲目的使用`update_attributes`, ,你可以被改變的屬性始終是白名單。)_
```
def update
account = Account.find params[:id]
account.update_attributes params.require(:account).permit(:name, :otherparam)
render :json => account
end
```
一個技巧: 通過設置`ActiveRecord::Base.include_root_in_json = false`,在模型上禁用默認命名空間的`to_json`來整合 Rails 3.1之前的版本, 。
**ajax**`Backbone.ajax = function(request) { ... };`
如果你想使用自定義的AJAX功能, 或者你的客戶端不支持的[jQuery.ajax](http://www.css88.com/jqapi-1.9/jQuery.ajax/) API,你需要調整的東西, 您可以通過設置`Backbone.ajax`這樣做。
**emulateHTTP**`Backbone.emulateHTTP = true`
如果你想在不支持Backbone的默認REST/ HTTP方式的Web服務器上工作, 您可以選擇開啟`Backbone.emulateHTTP`。 設置該選項將通過 `POST` 方法偽造 `PUT`,`PATCH` 和 `DELETE` 請求 用真實的方法設定`X-HTTP-Method-Override`頭信息。 如果支持`emulateJSON`,此時該請求會向服務器傳入名為 `_method` 的參數。
```
Backbone.emulateHTTP = true;
model.save(); // POST to "/collection/id", with "_method=PUT" + header.
```
**emulateJSON**`Backbone.emulateJSON = true`
如果你想在不支持發送 `application/json` 編碼請求的Web服務器上工作,設置`Backbone.emulateJSON = true;`將導致JSON根據模型參數進行序列化, 并通過`application/x-www-form-urlencoded` MIME類型來發送一個偽造HTML表單請求,