【问题标题】:Why does this trigger the "change" event on the Backbone Collection?为什么这会触发 Backbone Collection 上的“更改”事件?
【发布时间】:2012-12-20 15:35:03
【问题描述】:

为什么这会触发 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
    })

获取后,我们在控制台中看到“更改”。

请帮帮我。我必须使用这个事件,但如果数据没有改变,我不想在“cmets”上触发事件。

【问题讨论】:

    标签: collections backbone.js backbone-events


    【解决方案1】:

    收到来自collection.fetch() 的响应后,Backbone 会遍历响应中的每个模型并检查它是否已经在本地集合中。如果是,则遍历响应模型的每个属性,并检查本地模型是否具有相同的属性以及是否相等。

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

    [] === [] // false
    

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

    【讨论】:

    • 同样,m.get('comments').push(...)m.set('comments', m.get('comments').push(...)) 不会 触发更改事件,因为数组引用不会更改。数组作为模型属性很棘手。
    猜你喜欢
    • 2013-09-28
    • 2020-02-18
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多