2017-11-29 18 views
2

新しいモデルがコレクションに追加されるたびにモデルの位置属性を増やしたいので、デフォルトを++コレクションに等しい位置を返す関数に変換しようとしましたが、成功しませんでした。誰もがこれを行うための最善のアプローチをアドバイスできますか?追加時にバックボーンモデルの属性値を自動的にインクリメントしますか?

var Col = Backbone.Collection.extend() 
var Mod = Backbone.Model.extend({ 
    defaults() { 
     return { 
      position: ++this.collection.length 
     } 
    } 
}) 
var col = new Col([{ 
    id: 1 
}, { 
    id: 2 
}]) 

col.toJSON() // returns [{id: 1}, {id: 2}] 
+0

可能性のある重複した[コレクション属性に基づいてバックボーンモデルのデフォルトを設定する方法](https://stackoverflow.com/questions/13232904/how-to-set-backbone-models-defaults-based-on-コレクション属性) –

+0

具体的には[私の答え](https://stackoverflow.com/a/40476079/1218980)です。ほとんどの他の答えが言っているように 'create'、' add'などをオーバーライドしないでください。 –

+0

だから私はそのように位置を設定するには、コレクションの追加イベントを突然使用することができますか?あなたはnewModelメソッドを達成しているかどうか分かりません。 – styler

答えて

2

2つの異なる問題があります。

  1. Set Backbone model's defaults based on a collection attribute
    が、それは唯一の位置のためだ場合、これは必要ではないかもしれません。
  2. コレクション内のモデルの位置を追跡します。

使用コレクションのlengthは、正確に位置を追跡する十分ではありません。

3つのモデルがあると仮定すると、最初のモデルは位置1にあり、最後のモデルは位置3にあります。その後、最初の2つのモデルが削除され、新しいモデルが最後に追加されます。あなたはすでに矛盾したポジションを持っています。

コレクションに変更があるたびに、コレクション内のすべてのモデルの位置を更新する必要があります。

ここには、update eventを使用した簡単な例があります。

var PositionCol = Backbone.Collection.extend({ 
    initialize: function(models, options) { 
     this.listenTo(this, 'update', this.updatePositions); 
    }, 
    updatePositions: function(options) { 
     this.each(function(model, index) { 
      model.set({ position: index }); 
     }, this); 
    }, 
}); 
+1

これは意味があります!モデルの位置がコレクションの長さと同期していないことに気付きました。私は更新イベントリスナーを追加してうまく動作する位置更新を行っています。ありがとう! – styler

関連する問題