2016-10-05 3 views
0

新しいデータを受け取るたびにBackboneコレクションを一括リセットしたいのですが、リセットを行うたびにすべての現在のモデルが空になり、新しいデータが一番上にリセットされますが、新しいデータは、以前のモデルと並んで新しいモデルとして追加されます。誰でもこれを達成するために必要なことをアドバイスできますか?新しいモデルでバックボーンコレクションをリセットしても、以前のモデルは上書きされませんか?

JS

const OrderModel = Backbone.Model.extend({ 
    parse(response) { 
     response.name = `+${response.name}`; 
     console.log(response.name); 
     return response; 
    } 
}); 

const OrdersCollection = Backbone.Collection.extend({ 

    model: OrderModel, 

    initialize() { 
     setTimeout(() => { 
      this.trigger('snapshot', data); 
     }, 1000); 

     setTimeout(() => { 
      this.trigger('snapshot', data); 
     }, 2000); 

     this.listenTo(this, 'snapshot', this.setCollection, this); 
    }, 

    setCollection(response) { 
     this.reset(response, {parse: true}); 
    } 
}); 

jsFiddle:http://jsfiddle.net/kyllle/cpbcx7nt/

+0

私はあなたの問題を理解していません。あなたのコレクションがリセットされるたびに、長さは常に3です。 –

+0

コレクションがリセットされるたびにフィドルをチェックすると、さらに3つのモデルが追加されます。私が実行している問題は、モデルデータの最初のセットが設定され、各モデルでパーズが実行されて+に名前が追加され、次のデータセットが設定され、モデルが再び解析されますが、今回は2 ++ get追加されるなど。 – styler

答えて

2

フィドル:http://jsfiddle.net/cpbcx7nt/3/

発生2つの問題があります。

最初の問題は、コレクションをリセットしているときに、htmlをリセットしていないことです。前の3つのリスト項目をもう一度追加する前にそれらをクリアする必要があります。これと同様

renderRows() { 
    this.$el.empty() 
    this.collection.each(this.renderRow, this); 
}, 

第二の問題は、コード

const OrderModel = Backbone.Model.extend({ 
    parse(response) { 
     response.name = `+${response.name}`; 
     return response; 
    } 
}); 

パラメータresponsedata参照配列内のオブジェクトのこの部分です。 nameプロパティをresponseに変更すると、data内の参照オブジェクトも変更されます。最初の解析でdataを突然変異させたため、パーズが呼び出されたときに余分な "+"が表示されます。

この偶発的な上書きを防ぐためにオブジェクトをクローンしました。

const OrderModel = Backbone.Model.extend({ 
    parse(response) { 
     var model = _.clone(response); 
     model.name = `+${response.name}`; 
     return model; 
    } 
}); 
+0

偉大な答えは、私は常にデータ変数を直接解析しただけで、このタイプの実装でこの問題に遭遇しました。私のメインプロジェクトでこれを試して、問題が解決したかどうかを見てみましょう!ありがとう – styler

関連する問題