我更新到Backbone 1.1时似乎出现了此问题。我有一个嵌套的骨干模型:
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中也有类似的工作。关于如何避免该问题的其他想法?
problems
每次model.fetch
完成属性时,您都需要重新实例化属性,对象会有所不同,从而触发新的循环。
我通常会处理嵌套模型:
initialize
函数中实例化它,set
或reset
父parse
函数中的此对象,并返回忽略设置数据的响应像这样的东西:
var ProblemSet = Backbone.Model.extend({
defaults: {
name: "",
open_date: "",
due_date: ""
},
initialize: function (opts) {
var pbs = (opts && opts.problems) ? opts.problems : [];
this.problems = new ProblemList(pbs);
},
parse: function (response) {
response.name = response.set_id;
if (response.problems)
this.problems.set(response.problems);
return _.omit(response, 'problems');
}
});
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句