更新:ジャックワンダーの答えはより良い解決策です...
私の素朴な解決策と彼の単純な解決策を比較して対比するのは興味深いので、ここにとどめておきます。初心者のプログラマーは、この 2 つを評価することで何かを学ぶことができます。:-)
刺してみます。あなたはこのようなことをするかもしれません。基本的に、モデルをコレクションに追加するたびに名前チェックを行う eventListener を追加します。nameTracking
配列は、一意の名前フラグメントと、名前ルートの最後のカウントを追跡するカウンターを持つ名前オブジェクトの一種のカタログです。増分アプリケーションに役立ちます。
ListSet = Backbone.Collection.extend({
initialize: function() {
this.nameTracking = [];
this.on('add', this.pushModelName, this);
},
pushModelName: function(model, collection) {
// First, look through current collection for a model with same name
var duplicate = this.find(function(listModel) {
return model.get('name') === listModel.get('name');
});
// If duplicate exists, we lookup the name and counter in the nameTracking array.
if (duplicate) {
var nameObj = _.find(this.nameTracking, function(nameObj) {
return nameObj.name === model.get('name');
});
// We increment the counter so that our added model is appended with the
// correct, "latest" increment/indicator
nameObj.count = nameObj.count++;
model.set('name', model.get('name') + '_' + nameObj.count);
// Otherwise it doesn't exist so we push the name into our nameTracking array
} else { // Not a duplicate, new name
var modelName = model.get('name');
this.nameTracking.push({
'name': modelName,
'count': 0
});
}
}
});
nameTracking[]
注意すべきことは、これは、追加するモデルが新しいモデルであり、コレクションに既に存在するモデルの id を既に持っているモデルではないことを前提としていることです (クローンではありません)。コレクションの初期化、またはfetch()
これはゼロから始めていることを前提としているためです。モデルの削除や名前カウンターの更新については扱いませんが、このスケッチに基づいて、そのような性質のものが必要な場合は実装するのは難しくありません。