5

コレクションを含むバックボーン モデルがあります。

var Stream =  Backbone.Model.extend({
    defaults: {
        dummyField: "1",
        excludedUsers: new Backbone.Collection()
    }
});

var s = new Stream;
s.get('excludedUsers').add( {name:'Stefan'} );
console.log(s.toJSON())

収量:

{ dummyField: '1',
  excludedUsers: 
   { length: 1,
     models: [ [Object] ],
     _byId: {},
     _byCid: { c1: [Object] } } }

「期待される」の代わりに:

 { 
      dummyField: '1',
      excludedUsers: [ {name:'Stefan'} ]
 }

バックボーンはモデルを深く JSON 化していないためです。回避する唯一の方法は、ストリームのプロトタイプでtoJSON メソッドをオーバーライドすることですが、それは他のケースでは役に立ちません。一般的な/より良い解決策 (重いBackbone.Relationalプラグイン以外) は既にありますか?

4

2 に答える 2

0
function flattenModel(model) {
    return _.mapValues(model.attributes, flatten);
}

function flattenCollection(collection) {
    return collection.map(flattenModel);
}

function flatten(object) {
    if (object instanceof Backbone.Model) {
        return flattenModel(object);
    } else if (object instanceof Backbone.Collection) {
        return flattenCollection(object);
    }

    return object;
}

これはオブジェクトを返し、次に:

JSON.stringify(flatten(model))

_.mapValuesは lodash の便利なメソッドであるため、それを使用するか、そのメソッドを単に移植する必要があることに注意してください。

于 2015-11-11T12:07:14.920 に答える
0

関数を直接上書きするBackbone.Collection.toJSON()か、他のすべてのコレクションを拡張する新しいコレクションを作成することができます。

var MyDefaultCollection = Backbone.Collection.extend({
    toJSON: function() {
        //Your code here
    }
});
var Stream = Backbone.Model.extend({
    defaults: {
        dummyField: "1",
        excludedUsers: new MyDefaultCollection()
    }
});
//You could also extend it
var NewCollection = MyDefaultCollection.extend({
    //custom code here
});

これは単なる理論であり、コーディングしたことはないので、私のアイデアに関するフィードバックは大歓迎です :)

于 2012-10-18T15:00:54.787 に答える