backbone.jsのCollectionごとsaveする

Modelのsave()を使用するとurlで指定したサーバー上のスクリプトにputリクエストで送ってくれるため、一々リクエストを整形したりサーバーとの通信を開いたりする部分を書かなくてとても便利。しかしModelの集合であるCollectionにはなぜかその機能が無い。そのためeach()でsaveを呼び出していると、Collectionの要素数だけ呼び出されてしまうので、数が多いと大変なことになる。そのやり方のメモ。

// Collection    
var ItemCollection = Backbone.Collection.extend({ 
    model: Item,
    url: "update-items.php",
    save: function(){
        Backbone.sync("update", this, {
            success: function(){
                console.log("save successfully");
            },
            error: function(){
                console.log("error saving");
            }
            
        });
    }
});

とこのようにCollectionにurlとsaveを定義する。これでItemCollectionのインスタンスでsave()を呼ぶと、JSONの配列となった状態でurlで指定したURLにputされる。
受け取り側はPHPだと、$_GETでも$_POSTでも拾えないので注意。
ModelであるItemのインスタンスにpriceというプロパティーがあると仮定して、このようにそれを受け取ることができる。

$datainput = fopen("php://input", "r");
if($datainput){
	while ($data = fread($datainput, 10240)){
		$objarray = json_decode($data);
	}
}
error_log($objarray[0]->price);

JSONの配列になっていることに注意する。この配列をイテレートしながらDBに追加したりすることができるはず。