Backbone.js入門その1〜Model

ファイル読み込み

<script
src="http://cdnjs.cloudflare.com/ajax/libs/zepto/1.0/zepto.min.js"></script>
 <script
src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.4.4/underscore-min.js"></script>
<script
src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.10/backbone-min.js"></script>

Modelオブジェクト生成

var model = new Backbone.Model();
console.log(model); // g.Model {cid: "c1", attributes: Object, _changing: false, _previousAttributes: Object, changed: Object…}

独自モデル定義

var MyModel = Backbone.Model.extend({
    method1: function () {
        console.log('method1');
    },
    method2: function () {
        console.log('method2');
    }
});
var myModel = new MyModel();
myModel.method1();
myModel.method2();

staticメソッド定義

var MyModel = Backbone.Model.extend(/* instance methods */ {
    method1: function () {
        console.log('method1');
    },
    method2: function () {
        console.log('method2');
    }
}, /* static methods */  {
    staticMethod: function() {
        console.log('staticMethod');
    }
});
var myModel = new MyModel();
myModel.method1();
myModel.method2();
MyModel.staticMethod();

属性設定

var model = new Backbone.Model();
model.set('foo', 1);
model.set('bar', 'a');
model.set({a: 100, b: 200});

console.log(model.get('foo')); // 1
console.log(model.get('bar')); // a
console.log(model.get('hoge')); // undefined
console.log(model.get('a')); // 100
console.log(model.get('b'))  // 200
console.log(model.toJSON()); // Object {foo: 1, bar: "a", a: 100, b: 200}

初期値設定

var model = new Backbone.Model({c: 'x', d: 'y'});
model.set({a: 100, b: 200})

console.log(model.get('a')); // 100
console.log(model.get('b')); // 200
console.log(model.get('c')); // x
console.log(model.get('d')); // y
console.log(model.toJSON()); // Object {c: "x", d: "y", a: 100, b: 200} 

初期処理

var MyModel = Backbone.Model.extend(/* instance methods */ {
    initialize: function (params) {
        this.set('message', 'Hello ' + this.get('name') + '!');
    },
    hello: function () {
        console.log(this.get('message'));
    }
});
var myModel = new MyModel({name: 'Backbone.js'});
myModel.hello(); // Hello Backbone.js!

独自コンストラクタ

var MyModel = Backbone.Model.extend({
    constructor: function (name) {
        var message = 'Hello ' + name + '!';
        Backbone.Model.prototype.constructor.call(this, {message: message});
    },
    hello: function () {
        console.log(this.get('message'));
    }
});
var myModel = new MyModel('Backbone.js');
myModel.hello(); // Hello Backbone.js! 

デフォルト値設定

 var MyModel = Backbone.Model.extend({
    defaults: {
        name: 'World'
    },
    initialize: function (params) {
        this.set('message', 'Hello ' + this.get('name') + '!');
    },
    hello: function () {
        console.log(this.get('message'));
    }
});
var myModel0 = new MyModel();
myModel0.hello(); // Hello World!

var myModel = new MyModel({name: 'Backbone.js'});
myModel.hello(); // Hello Backbone.js!

デフォルト値の継承

var MyModel = Backbone.Model.extend({
    defaults: {
        name: 'World'
    },
    initialize: function (params) {
        this.set('message', 'Hello ' + this.get('name') + '!');
    },
    hello: function () {
        console.log(this.get('message'));
    }
});

var MyChild = MyModel.extend({
    defaults: {
        a: 1
    }
});

var myModel0 = new MyChild();
console.log(myModel0.toJSON()); // Object {a: 1, message: "Hello undefined!"}
myModel0.hello(); // Hello undifined!

var myModel = new MyChild({name: 'Backbone.js'});
console.log(myModel.toJSON()); // Object {name: "Backbone.js", a: 1, message: "Hello Backbone.js!"} 
myModel.hello(); // Hello Backbone.js!

親のdefaultsが上書きされてしまっている。underscore.jsの _.extend を使えば良い。

var MyModel = Backbone.Model.extend({
    defaults: {
        name: 'World'
    },
    initialize: function (params) {
        this.set('message', 'Hello ' + this.get('name') + '!');
    },
    hello: function () {
        console.log(this.get('message'));
    }
});

var MyChild = MyModel.extend({
    defaults: _.extend({
        a: 1
    }, MyModel.prototype.defaults)
});

var myModel0 = new MyChild();
console.log(myModel0.toJSON()); // Object {a: 1, name: "World", message: "Hello World!"}
myModel0.hello(); // Hello world!

var myModel = new MyChild({name: 'Backbone.js'});
console.log(myModel.toJSON()); // Object {name: "Backbone.js", a: 1, message: "Hello Backbone.js!"}
myModel.hello(); // Hello Backbone.js!

↓の写経に近いですが・・

プロになるためのJavaScript入門 ~node.js、Backbone.js、HTML5、jQuery-Mobile (Software Design plus) Developing Backbone.js Applications