backbone.js:覆盖toJSON

时间:2012-08-14 18:44:51

标签: javascript json backbone.js underscore.js

我正在尝试在Backbone.Model中实现某种嵌套集合

要做到这一点,我必须覆盖解析服务器响应并将数组包装到集合中的适配器函数以及在没有任何帮助方法的情况下序列化整个对象的函数。我遇到第二个问题。

var Model = Backbone.Model.extend({

    urlRoot: "/model",

    idAttribute: "_id",

    // this wraps the arrays in the server response into a backbone  collection
    parse: function(resp, xhr) {
        $.each(resp, function(key, value) {
            if (_.isArray(value)) {
                resp[key] = new Backbone.Collection(value);
            } 
        });
        return resp;
    },

    // serializes the data without any helper methods
    toJSON: function() {
        // clone all attributes
        var attributes = _.clone(this.attributes);

        // go through each attribute
        $.each(attributes, function(key, value) {
            // check if we have some nested object with a toJSON method
            if (_.has(value, 'toJSON')) {
                // execute toJSON and overwrite the value in attributes
                attributes[key] = value.toJSON();
            } 
        });

        return attributes;
    }

});

现在问题出现在toJSON的第二部分。 出于某种原因

_.has(value, 'toJSON') !== true

不会返回true

有人可以告诉我出了什么问题吗?

1 个答案:

答案 0 :(得分:4)

Underscore's has这样做:

  

_.has(object, key)

     

对象是否包含给定的密钥?与object.hasOwnProperty(key)相同,但使用hasOwnProperty函数的安全引用,以防它被意外覆盖。

但由于value来自原型,所以toJSON将没有toJSON属性。(请参阅http://jsfiddle.net/ambiguous/x6577/)。

您应该使用_(value.toJSON).isFunction()代替:

if(_(value.toJSON).isFunction()) {
    // execute toJSON and overwrite the value in attributes
    attributes[key] = value.toJSON();
}