Angular:将ng-repeat,数组和对象与id混合

时间:2014-05-26 03:41:06

标签: arrays angularjs data-structures angularjs-ng-repeat ng-repeat

我有一系列项目,我们使用ng-repeat 和过滤

每个项目都有唯一的ID,并存储在数组中:

[ {id: 387, name: "hello"}, {id: 2878, name: "world"}, ...]

但是现在我需要通过它们唯一的 id 而不是数组索引来引用这些对象(以及使用带过滤器的ng-repeat)。

所以我尝试使用稀疏数组:

array[387] = {name: "hello"}; array[2878] = {name: "world"}...

但是ng-repeat因为看到“重复”而自行cra未定义的键。 (我也尝试使用'跟踪'但ng-repeat仍然不喜欢它。)

我无法使用带有ng-repeat的对象,因为过滤器无法正常工作。

Soooo,我如何将ng-repeat与过滤器一起使用,并且能够通过id引用项目?我能想到的唯一选择是建立第二个数据结构来将id映射到索引。

感谢您的帮助!

克里斯。

3 个答案:

答案 0 :(得分:1)

试试这个:

'跟踪$ index'

ng-repeat ="列表中的名称由$ index"

跟踪

答案 1 :(得分:0)

当我需要实现这类功能时,我会对抓取的数据进行快速预处理,并创建必要的查找。例如:

var data = [
    { id: 55, name: 'some name' },
    { id: 65, name: 'another name' }
];

// create a lookup
var lookup = {};
angular.forEach(data, function(item){
    lookup[data.id] = item;        
});

您可以在此处以任何方式操作数据,但通过引用实际的数组项,您可以将数据或查找(或两者)绑定到$scope,并且将在两个结构上展示任何更改。请记住,如果您从阵列中添加/删除项目,则不会发生这种情况,因为您需要管理查找中项目的添加和删除。

答案 2 :(得分:0)

我可以看到你的id是整数。角度过滤器不起作用,因为角度使用字符串比较数字。

转到angular.js搜索函数名filterFilter。第13991行第1至第10.10行。然后你可以在ng-repeat中使用对象。

function filterFilter() {
  ...

  var search = function(obj, text){
  if (typeof text == 'string' && text.charAt(0) === '!') {
    return !search(obj, text.substr(1));
  }
  switch (typeof obj) {
    case "boolean":
    case "number": // <-- here
                   // add return obj === text;
    case "string":
      return comparator(obj, text);
    case "object":
      switch (typeof text) {
        case "object":
          return comparator(obj, text);
        default:
          for ( var objKey in obj) {
            if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
              return true;
            }
          }
          break;
      }
      return false;
    case "array":
      for ( var i = 0; i < obj.length; i++) {
        if (search(obj[i], text)) {
          return true;
        }
      }
      return false;
    default:
      return false;
  }
};