如何检查主干集合是否已包含具有相同idAttribute的模型?

时间:2018-01-08 12:59:06

标签: javascript backbone.js underscore.js

我的骨干模型的idAttribute可以是任何东西(Backbone的默认值是“id”)。 我想在将模型插入Backbone集合之前进行检查,如果该集合已经包含具有相同idAttribute值的模型。

myCollection.contains(myNewModel)始终返回false。我想那是因为候选模型不一定是集合中已经存在的同一个实例。

我试过

idAttribute: string = myColllection.model.prototype.idAttribute; // Works fine
let id: string = itemToInsert.get(idAttribute); // Works fine
let exists : boolean : myCollection.findWhere({ idAttribute : id }); // Undefined!

我想要像

这样的东西
let test: boolean = _.any(self.collection, item => idAttributeValue === item.get("idAttribute")).value();

但我不确定准确的语法。

1 个答案:

答案 0 :(得分:1)

您可以使用Collection.get来确定某个集合是否包含具有给定id的模型,而不管基础idAttribute

例如,



var M = Backbone.Model.extend({
  idAttribute: 'whatever'
});
var C = Backbone.Collection.extend({
  model: M,
  hasModel: function(input) {
    return !!this.get(input);
  }
});

var c = new C([{whatever : 1}]);
console.log(c.hasModel(1)); // true
console.log(c.hasModel(2)); // false

var newModel = new M({whatever: 1});
console.log(c.hasModel(newModel)); // true

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/backbone.js/1.2.3/backbone-min.js"></script>
&#13;
&#13;
&#13;

如果您想使用findWhere,则必须使用square bracket notation作为属性哈希:

var finder = [];
var idAttribute = M.prototype.idAttribute;
finder[idAttribute] = 1;
console.log(c.findWhere(finder));