这个问题似乎只是在我更新到 Backbone 1.1 时出现。我有一个嵌套的 Backbone 模型:
var ProblemSet = Backbone.Model.extend({
defaults: {
name: "",
open_date: "",
due_date: ""},
parse: function (response) {
response.name = response.set_id;
response.problems = new ProblemList(response.problems);
return response;
}
});
var ProblemList = Backbone.Collection.extend({
model: Problem
});
我最初加载了一个 ProblemSetList,它是我页面中的 ProblemSet 模型的集合。对任何 ProblemSet 的 open_date 或 due_date 字段的任何更改,首先转到服务器并更新该属性,然后返回。这会在 ProblemSet 上触发另一个更改事件。
似乎服务器的所有后续返回都会触发另一个更改事件,并且更改的属性是“问题”属性。这会导致无限递归调用。
问题似乎来自 Backbone.Model 的 set 方法部分(此处从第 339 行列出的代码)
// For each `set` attribute, update or delete the current value.
for (attr in attrs) {
val = attrs[attr];
if (!_.isEqual(current[attr], val)) changes.push(attr);
if (!_.isEqual(prev[attr], val)) {
this.changed[attr] = val;
} else {
delete this.changed[attr];
}
unset ? delete current[attr] : current[attr] = val;
}
// Trigger all relevant attribute changes.
if (!silent) {
if (changes.length) this._pending = true;
for (var i = 0, l = changes.length; i < l; i++) {
this.trigger('change:' + changes[i], this, current[changes[i]], options);
}
}
对问题属性的比较从 _.isEqual() 返回 false,因此会触发更改事件。
我的问题是:这是做嵌套主干模型的正确方法吗?我在 Backbone 1.1 中有类似的工作。关于如何继续避免这个问题的其他想法?