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に追加したりすることができるはず。