首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使Backbone.js收藏项具有唯一性?

如何使Backbone.js收藏项具有唯一性?
EN

Stack Overflow用户
提问于 2011-06-21 04:17:58
回答 12查看 18K关注 0票数 16

假设我有这些Backbone.js模型:

代码语言:javascript
复制
var Truck = Backbone.Model.extend({});

var truck1 = new Truck();
var truck2 = new Truck();

truck1.set("brand", "Ford");
truck2.set("brand", "Toyota");
truck3.set("brand", "Honda");
truck4.set("brand", "Ford");

然后,假设我们有一个Backbone.js集合:

代码语言:javascript
复制
var TruckList = Backbone.Collection.extend({
  model: Truck,
  comparator: function(truck) {
     return truck.get("brand");
  };

});

我是一个汽车收藏家,所以是时候把每一辆车都添加到我的收藏中了:

代码语言:javascript
复制
Trucks = new TruckList();
Trucks.add(truck1);
Trucks.add(truck2);
Trucks.add(truck3);
Trucks.add(truck4);

仅仅关注品牌属性,truck4就是truck1的翻版。我的收藏中不能有重复项。我需要我的收藏有独特的价值。

我的问题是,如何从我的Backbone.js收藏中删除重复的项目?

我应该为此使用Underscore.js吗?如果是这样,有人能提供一个如何做到这一点的工作/可运行的示例吗?

假设如下所示:

1.集合未排序

必须对品牌属性值

  • Ajax调用执行
  1. 删除,以填充卡车的每个实例。这意味着在添加到集合时,您没有访问卡车属性的权限。
EN

回答 12

Stack Overflow用户

发布于 2011-06-21 04:26:47

我将覆盖TruckList集合中的add方法,并使用下划线来检测其中的重复项并拒绝重复项。就像这样。

代码语言:javascript
复制
TruckList.prototype.add = function(truck) {
    // Using isDupe routine from @Bill Eisenhauer's answer
    var isDupe = this.any(function(_truck) { 
        return _truck.get('brand') === truck.get('brand');
    });

    // Up to you either return false or throw an exception or silently ignore
    // NOTE: DEFAULT functionality of adding duplicate to collection is to IGNORE and RETURN. Returning false here is unexpected. ALSO, this doesn't support the merge: true flag.
    // Return result of prototype.add to ensure default functionality of .add is maintained. 
    return isDupe ? false : Backbone.Collection.prototype.add.call(this, truck);
}
票数 19
EN

Stack Overflow用户

发布于 2012-06-27 15:36:24

要实现这一点,最简单的方法是确保要添加的模型具有唯一的ids。默认情况下,主干集合不会添加具有重复ids的模型。

代码语言:javascript
复制
test('Collection should not add duplicate models', 1, function() {
    var model1 = {
        id: "1234"
    };
    var model2 = {
        id: "1234"
    };

    this.collection.add([model1, model2]);

    equal(1, this.collection.length, "collection length should be one when trying to add two duplicate models");
});
票数 7
EN

Stack Overflow用户

发布于 2011-06-21 07:46:24

尝尝这个。它使用任何下划线方法来检测潜在的重复项,如果是,则将其转储出去。当然,您可能希望使用一个异常来修饰它,以使其更加健壮:

代码语言:javascript
复制
TruckList.prototype.add = function(newTruck) {
  var isDupe = this.any(function(truck) { 
    return truck.get('brand') === newTruck.get('brand');
  }
  if (isDupe) return;
  Backbone.Collection.prototype.add.call(this, truck);
}

顺便说一句,我可能会在Truck上写一个函数来做复制检查,这样集合就不会知道太多关于这种情况的信息。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6416958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档