更新:jackwander 的答案是一个更好的解决方案......
不过,我将把它保留在这里,因为将我的幼稚解决方案与他的解决方案进行比较和对比很有趣。初学者程序员,你可以通过评估两者来学习一些东西。:-)
我会试一试。你可能会做这样的事情。基本上,我们添加一个 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
});
}
}
});
需要注意的是,这假设您要添加的模型是一个新模型,而不是已经具有集合中已经存在的模型的 id(不是克隆)。您还需要一些方法来更新nameTracking[]
on集合初始化,或者fetch()
因为这假设您从头开始。我不处理模型的删除和更新名称计数器的东西,但根据这个草图,如果你想要这种性质的东西,它应该不难实现。