1

Backbone 有很好的方法来提取和更新作为集合(对象数组)一部分的单个模型(单个数据集)。

我现在只是在学习 Angular,并且被绑定、过滤和模板(更喜欢下划线)所震撼。它使许多任务变得轻松。

不过,我正在努力寻找一种简单的方法将单个对象从对象数组中拉出。根据我在线阅读的内容,我的选择是在 ng-repeat 上使用过滤器(这似乎有点奇怪,因为我没有“重复”任何东西,或者拉入 jquery 并使用 $.grep。另一种方式可能是构建我自己的过滤器或用原始 javascript 编写一些东西。

您将使用哪种方式从数组中拉出单个对象?请记住,在 Backbone 中,集合中的每个对象都有一个唯一的“id”属性,并且我在 Angular 中对我的业务数据使用相同的范例。我宁愿不拉入 jquery 或下划线只是为了做到这一点。

抱歉,如果存在 Angular 方法 - 我发现文档导航有点棘手。如果是,请举一个使用中的例子。非常感谢。

4

3 回答 3

2

在 Backbone 中,collection.findWhere只委托 Underscore 的find方法,这非常简单——它只是循环遍历集合,直到找到与谓词匹配的元素。

我只想写一个辅助函数来做到这一点。例如:

function find(array, attrs) {
  for (var i = 0, len = array.length; i < len; i++) {
    for (var key in attrs) {
      if (array[i][key] !== attrs[key]) {
        break;
      }
      return array[i];
    }
  }
  return null;
}

并像这样使用它:

findFirst(items, {id: 3});
于 2013-05-27T19:15:49.043 回答
1

我建议尝试一下 Lodash——这几乎是我最喜欢的东西,我们的团队在 Sails/Waterline 和我们的客户项目中广泛使用它。特别是,检查_.find()


常用用法

var fluffyTheCat = _.find(cats, { name: 'fluffy' });


例子

// assuming you've got "$scope.cats"

// you can do nice criteria-based lookups on a per-attribute basis:
_.find($scope.cats, { name: 'fluffy' });

// or do something lower-level:
// (return true to declare a match, false to keep going)
_.find($scope.cats, function (cat) {
  return cat.name.match(/^fluffy/i);
});

文档

来自http://lodash.com/docs#find:

_.find(collection, [callback=identity], [thisArg])

遍历集合的元素,返回回调返回 truey 的第一个元素。回调绑定到 thisArg 并使用三个参数调用;(值,索引|键,集合)。

如果为回调提供了属性名称,则创建的“_.pluck”样式回调将返回给定元素的属性值。

如果为回调提供了一个对象,则创建的“_.where”样式回调将为具有给定对象属性的元素返回 true,否则返回 false。


另请参阅_.where(),它返回一个匹配数组,而不仅仅是一个。

于 2014-05-05T13:48:06.440 回答
0

因为我不需要遍历对象中的每个属性,即我知道我只匹配 id 属性,所以我想出了这个位于我的控制器中的函数。如果我将 $routeParams.item 传递给控制器​​,就会调用它。$routeParams.item 指定我想要获取的对象的“id”。我将返回值应用到 $scope.dataIs 属性,这意味着我现在可以绑定到它。

$scope.getDataIs = function(item){
    var dataIs;

    for (i = 0; i < $scope.data.length; i++) {
        if ($scope.data[i]['id'] == item) {
            dataIs = $scope.data[i];
            break;
        }
    }
    return dataIs;
}
于 2013-05-28T11:04:23.853 回答