4

これにより、バックボーン コレクションで「変更」イベントがトリガーされるのはなぜですか?

data.json ファイル:

[
    {
        "id": 1,
        "name": "Alex",
        "comments": [
            {
                "id":5
            }
        ]
    },
    {
        "id": 2,
        "name": "Tom",
        "comments": []
    }
]

モデルのデータ:

data = [
    {
        id: 1,
        name: "Alex",
        comments: [
            {
                id:5
            }
        ]
    },
    {
        id: 2,
        name: "Tom",
        comments: []
    }
]

var Model = Backbone.Model.extend({
    initialize: function () {
        console.log('init model');
    }
});

var View = Backbone.View.extend({
    initialize: function () {
        console.log('init view');
    }
});

var Collection = Backbone.Collection.extend({
    model: Model,
    url: "data.json",

    initialize: function () {
        console.log('init collection');
    }
});

モデルにデータを追加します。

var collection = new Collection(data);

collection.on('change', function () {
    console.log('change');
})

フェッチ:

 collection.fetch({
        update: true,
        merge: true
    })

取得後、コンソールに「変更」が表示されます。

私を助けてください。このイベントを使用する必要がありますが、データが変更されていない場合、「コメント」でイベントをトリガーしたくありません。

4

1 に答える 1

2

からの応答を受信するとcollection.fetch()、Backbone は応答内の各モデルを調べて、ローカル コレクションに既に存在するかどうかを確認します。その場合、応答のモデルの各属性を調べて、ローカル モデルに同じ属性があるかどうか、および等しいかどうかを確認します。

これはすべてうまくいきますが、ご想像のとおり、2 つの配列は JavaScript では等しくなりません。

[] === [] // false

したがって、Backbone が応答のcomments属性に到達すると、応答からの値とローカルでは同じように見えますが、(JavaScript によると) それらは等しくありません。バックボーンはこれを違いと見なし、changeイベントを発生させます。

于 2012-12-20T16:04:45.840 に答える