嵌套的骨干模型在保存时会导致无限递归

彼得·斯塔伯

我更新到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完成属性时您都需要重新实例化属性,对象会有所不同,从而触发新的循环。

我通常会处理嵌套模型:

  • 在Backbone处理的属性之外使用模型属性,
  • initialize函数中实例化它
  • setresetparse函数中的此对象,并返回忽略设置数据的响应

像这样的东西:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章