Backbone.js在permalink集合中所有模型的唯一属性名称
Backbone.js unique attribute name across all models in collection for permalink
我想确保在创建新模型时,特定属性在集合中是唯一的,这样我最终可以将该属性用作永久链接。
我有一个列表集合和列表模型。(CoffeeScript)
class App.Models.List extends Backbone.Model
defaults:
name: "My New List"
class App.Collections.ListSet extends Backbone.Model
model: App.Models.List
当一个新模型被添加到ListSet时,如果已经存在具有该名称的模型,我想在name属性的末尾添加一个自动递增的数字。例如,如果存在具有My New List
的模型,则为My New List 1
。
我不希望它显得突兀并显示错误,而是自动修复问题。我对添加递增整数背后的逻辑很满意,但我需要指示将代码放在哪里进行更改。
这可能对您有用:
App.Models.List = Backbone.Model.extend({
initialize: function(attrs) {
this.set(attrs);
this.set({originalName: attrs.name});
var count = yourCollection.reduce(function(count,model){
return count + (model.get('originalName') === this.get('originalName') ? 1 : 0);
},0,this);
if(count > 0) {
this.set({name: this.get('name') + ' ' + count});
}
}
});
这里有一个演示:jsFiddle demo
这应该做的是,每次初始化模型时,都要扫描集合,看看是否有其他模型具有相同的originalName
。如果是,则将结果附加到name属性中。
===更新===
我现在意识到,最好在将模型添加到集合时进行修改,以便将模型与集合解耦。以下是更新的代码片段:
App.Models.List = Backbone.Model.extend({
initialize: function(attrs) {
this.set({originalName: attrs.name});
}
});
App.Collections.Lists = Backbone.Collection.extend({
model: App.Models.List,
initialize: function() {
this.on('add',this.resolveNameConflict,this);
},
resolveNameConflict: function(model){
var count = this.reduce(function(c,m){
return c + (m.get('originalName') === model.get('originalName') ? 1 : 0);
},0);
if(count > 1) {
model.set({name: model.get('originalName') + ' ' + (count-1)});
}
}
});
和一个演示:jsFiddle demo
更新:jackraver的答案是一个更好的解决方案不过,我将把这个放在这里,因为将我天真的解决方案与他的解决方案进行比较和对比很有趣。初级程序员,你可以通过评估两者来学到一些东西。:-)
我试试看。你可能会做这样的事。基本上,我们添加了一个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的模型(而不是克隆)。您还希望在集合初始化或fetch()
时以某种方式更新nameTracking[]
,因为这假设您是从头开始的。我不处理删除模型和更新名称计数器的问题,但基于这个草图,如果你想要这种性质的东西,它应该不难实现。
- 在VanillaJS中模拟模型双向数据绑定
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- 骨干模型默认值-todos.js示例中不必要的代码
- EmberJS中支持单字母单词模型
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 将不在模型中的数据返回到mvc控制器
- 如何在视图模型contet更新更新上调用Jquery函数
- 如何使用Javascript客户端对象模型检索Sharepoint 2010列表项权限
- 我应该如何检查主干.主干.模型更改时查看
- Ext.js从json构建模型关系的问题
- 使用onkeyup JS事件检查输入的值是否唯一
- 显示模块模式在Knockout中设置模型的新实例
- ng重复中的ng模型-初始化唯一作用域属性
- Backbone.js在permalink集合中所有模型的唯一属性名称
- 如何使用 Wolfpack.js 测试我的 Sails.js 模型的唯一电子邮件属性
- getElementById与唯一的id从模型
- 在动态数组中更新唯一的Vue模型
- 在ng-repeat中,角唯一的ng-模型
- ES6 节点.js/快速.js模型对象的唯一主键