Backbone集合toJSON返回集合对象

时间:2015-08-07 08:39:17

标签: javascript json backbone.js

我有一个模型,它有一个骨干集合作为其属性之一。

如果我输出模型,我可以看到该集合,所有看起来都没问题。

如果我将集合的结果输出到JSON(),它显然会将整个集合对象输出为json。

以下两行:

console.log('about to sync', model);
console.log('files', model.attributes.files.toJSON());

提供以下输出:

Console output in Chrome 44

如您所见,集合在模型中存在且正确,但toJSON调用返回对象中的所有函数以及模型等,而不是“包含每个函数的属性哈希的数组”集合中的模型“

3 个答案:

答案 0 :(得分:2)

Backbone默认不处理子模型/集合,您必须插入所需的行为。在您的情况下,您只需覆盖模型上的toJSON以通过其数组表示替换集合。

这样的东西
var M = Backbone.Model.extend({
    toJSON: function() {
        var json = Backbone.Model.prototype.toJSON.call(this);
        json.files = this.get('files').toJSON();
        return json;
    }
});

演示http://jsfiddle.net/nikoshr/1jk8gLz4/

或者如果您更喜欢更一般的更改,请更改Backbone.Model.prototype.toJSON以包含所有模型的此行为。例如

(function () {
    var originalMethod = Backbone.Model.prototype.toJSON;

    Backbone.Model.prototype.toJSON = function(options) {
        var json = originalMethod.call(this, options);

        _.each(json, function(value, key) {
            if ((value instanceof Backbone.Collection) ||
                (value instanceof Backbone.Model))
                json[key] = value.toJSON();
        });

        return json;
    };
})();

http://jsfiddle.net/nikoshr/1jk8gLz4/2/

答案 1 :(得分:0)

Tom,你需要遍历对象中的每个元素,以便在完成toJSON()之后查看内容。我也面临同样的问题。了解如何解析JSON对象。打印时会有任何问题。

希望这会有所帮助!!

由于

答案 2 :(得分:0)

覆盖toJSON方法。

var yourModel = Backbone.Model.extend({
    toJSON: function(){
      var base = Backbone.Model.prototype.toJSON.call(this);
      for (key in base) {
        item = base[key];
        if (item.toJSON != null) {
          base[key] = item.toJSON();
        }
      }
      return base;
    }
});