1
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html>
<head>
<script
    src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script
    src="http://documentcloud.github.com/underscore/underscore-min.js"></script>
<script src="http://documentcloud.github.com/backbone/backbone-min.js"></script>
</head>
<body>

    <button id="cmd_create_event" name="cmd_create_event" type="button">Create
        a new `Event`</button>

    <script type="text/javascript">
        var EventModel = Backbone.Model.extend({
            initialize : function() {
                console.log("`Event` is initialized. id: " + this.cid);

                this.bind("change:status", function() {
                    console.log(this.get("status") + " is now the value for `status`");
                });

                this.bind("error", function(model, error) {
                    console.error(error);
                });
            },
            defaults : {
                "status" : 0
            },
            validate : function(attrs) {
                if (attrs.status <= 0)
                    return "invalid status";
            }
        });

        var EventList = Backbone.Collection.extend({
            initialize : function() {
                console.log("`EventList` is initialized");
            },
            model : EventModel,
            add : function(event) {
                console.log("`Event` added to `EventList`.");
            }
        });

        var EventView = Backbone.View.extend({});

        $(document).ready(function() {
            var event_list = new EventList();

            $("#cmd_create_event").click(function() {

                // GENERATION METHOD #1:
                /*var event = new EventModel();
                event.set({
                    status : 1
                });
                event_list.add(event);*/

                // GENERATION METHOD #2:
                event_list.add({
                    status : 1
                });

            });
        });
    </script>

</body>
</html>

上記のコードには、 を に追加するEventModelために使用している 2 つのメソッドがありEventListます。

方法 #1 は発火しEventModel.initialize()ますが、方法 #2 は発火しません。

ドキュメントには、方法 2 と同じようにオブジェクトを追加できると書かれていnew EventModel()ます。ドキュメントの引用:

モデル プロパティが定義されている場合は、未加工の属性オブジェクトを渡して、モデルのインスタンスとして有効化することもできます。

4

1 に答える 1

1

最初のメソッドでは、実際にモデルのコンストラクターを呼び出します

var event = new EventModel();

{ status: 1 }2 番目の方法では、前に定義したメソッドに渡すだけでEventList.add、コンソールにログを記録するだけで何もしません。

電話すれば

Backbone.Collection.prototype.add.call(this, event);

EventList.addメソッドで、Backbone は渡されたデータから新しいモデル インスタンスを作成し、呼び出されます (定義時に属性initialize()を指定したため)。modelEventList

于 2012-07-07T15:15:03.013 に答える