我有一系列项目,我们使用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映射到索引。
感谢您的帮助!
克里斯。
答案 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;
}
};