私のプロジェクトでは、バックボーンコレクションを使用してアプリケーションのデータを整理し、自分のデータをローカルストレージに同期させる必要があります。私のデータは2レベルの深いネストされたコレクションとモデルであり、そこに問題が発生します。ネストされたバックボーンのコレクションとモデルをシリアル化する方法は?
内部コレクションがlocalstorageに同期した後、内部コレクションはオブジェクトの生の配列になります。そのため、収集方法(add
など)は使用できません。
のlocalStorageがモデルをシリアライズ、それはmodel.toJSON()
呼び出し、それは単に、ネストされたコレクションを除いたモデルの属性をクローン:
は、デバッグとグーグルでの後、私はその理由を見つけました。
// Return a copy of the model's `attributes` object.
toJSON: function(options) {
return _.clone(this.attributes);
},
ので、Underscore's clone functionを使用し、ドキュメントはそれことを言う:
が提供平野オブジェクトの浅いコピーされたクローンを作成します。すべてのネストされた オブジェクトまたは配列は、複製されずに参照によってコピーされます。
したがって、デフォルトモデルの.toJSON
をオーバーライドするディープコピー方法を探しています。しかし、私は正しい方法を理解できません。例えば
、私は次のことを試してみました:
Backbone.Model.prototype.toJSON = function() {
var json = $.extend(true, {}, this.attributes);
return json;
};
エミールの提案に基づいて編集し、私の本当のモデルには、以下のようになります:オーバーライドした後
app.RecordItem = Backbone.Model.extend({
defaults: {
target: 1,
date: '',
day: '',
//foodlist: new TrackList(),
currentvalue: 0,
isSetup: false,
},
initialize: function() {
var days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
var months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
var d = new Date();
this.set("date", d.getDate() + "." + months[d.getMonth()]);
this.set("day", days[d.getDay()]);
//
var foodlist = this.getFoodlist();
if (!(foodlist instanceof TrackList)) {
this.set('foodlist', new TrackList(foodlist));
}
},
getFoodlist: function() {
if (!this.foodlist) this.foodlist = new TrackList(this.get('foodlist'));
return this.get('foodlist');
},
toJSON: function(options) {
// this gets the default behavior
var attrs = this.constructor.__super__.toJSON.apply(this, arguments);
var foodlist = attrs.foodlist;
if (foodlist) {
// then replace the collection reference with the actual serialized data
attrs.foodlist = foodlist.toJSON(options);
}
return attrs;
},
});
toJSON
方法。 JSONにシリアライズするのに必要ですので
localStorage店舗列:jQuery's extend
は深いコピーを提供するが、エラーメッセージは、それはあなたが必要なものではありませんし、ここに理由です、
"foodlist.toJSON is not a function(…)"
こんにちはエミール、私の2つの投稿された質問のすべてのこれらの情報ありがとう。しかし、私はまだ正しい動作を与えることはできません。私の更新された編集をご覧ください。 –
@baoqgerあなたは1つに2つのソリューションを混ぜた、それは動作するはずですが、あなたは1つを使用する必要があります。 'parse'をオーバーライドする方法をデモンストレーションし、属性が常にコレクションであることを実証するために、[私の他の答え](http://stackoverflow.com/a/40823148/1218980)を更新しました。 –