4

为什么这会触发 Backbone Collection 上的“更改”事件?

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 会遍历响应中的每个模型并检查它是否已经在本地集合中。如果是,那么它会遍历响应模型的每个属性,并检查本地模型是否具有相同的属性以及是否相等。

这一切都很好,很花哨,但是,正如你所预料的那样,两个数组在 JavaScript 中不会相等:

[] === [] // false

因此,当 Backbone 获取comments响应的属性时,尽管来自响应的值和本地的值看起来相等,但它们并不相等(根据 JavaScript)。Backbone 认为这是一种差异并触发了一个change事件。

于 2012-12-20T16:04:45.840 回答