Backbone.Modelに突っ込んでみる
前回同様ドキュメント読みつつ色々やってみた
var App = {
"Models": {},
"Collections": {},
"Views": {}
};
// Backbone.Model
App.Models.Sample = Backbone.Model.extend({
"idAttribute": "item_id", // model.idで参照可能なattributesキーを設定
"defaults": {
"title": "title"
}
});
var m = new App.Models.Sample({ "name": "hoge" });
m.validate = function(attrs, options) {
return false;
};
m.on("invalid", function(model, error) {
console.log("ERROR: " + error);
});
m.on("change", function(model) {
console.log(m.previous("name")); // 変更前のデータを出力。previousAttributesっていうメソッドを使うと特定属性データだけじゃなくて、変更前の属性データが取得できるのかも
});
m.url = "http://localhost:5000/save/sample"; // POSTメソッドでリクエストされる。セットされているデータは送られる
m.set("name", "fuga");
m.save();
m.url = "http://localhost:5000/delete/sample"; // DELETEメソッドでリクエストされる。セットされているデータ等は送られない?
m.set("item_id", 1);
m.set("name", "hoge");
m.destroy();
な感じかと。Backbone.Modelのvalidateメソッドでsave等((他に何が該当するかは現時点では不明))で処理前に実行されてセットされているデータを検証する事が可能な模様。返す値はエラーでinvalidなイベントがtriggerされる模様
で昨日調査していたその時のツイートが
Backbone.Model.validationErrorはコールバックじゃなくて、validateメソッドが返した値がここにぶち込まれてる的な感じか
— kinjouj (@kinjou_j) February 23, 2013
validationがfailなコールバックはinvalidなイベントで処理可能だとの事
— kinjouj (@kinjou_j) February 23, 2013
Backbone.Model.isNewがid(idAttribute)があるか無いかでチェックされてんのかなと
— kinjouj (@kinjou_j) February 23, 2013
ソースによると「return this.id == null」らしい
— kinjouj (@kinjou_j) February 23, 2013
isValidっていうドキュメントにはないメソッドがある
— kinjouj (@kinjou_j) February 23, 2013
destroyが処理されねーなって思ったら、isNewがtrueの場合はスキップするようになってんのか
— kinjouj (@kinjou_j) February 23, 2013
destroyはDELETEメソッドが飛んでくる。多分こういう場合クロスドメインなケースだとAccess-Control-Allow-Methodsの指定が必要かなと
— kinjouj (@kinjou_j) February 23, 2013
追記
http://qiita.com/items/5acef8dd49f67fd7813c によると「silentを使うと後述するvalidateを用いたバリデーションも実行されない」っていうのがある模様