在Angular中,我需要search数组中的对象
在Angular中,我的范围是一个返回大量对象的对象。 每个人都有一个ID(这是存储在一个平面文件,所以没有数据库,我似乎无法用户ng-resource
)
在我的控制器中:
$scope.fish = [ {category:'freshwater', id:'1', name: 'trout', more:'false'}, {category:'freshwater', id:'2', name:'bass', more:'false'} ];
在我看来,我有更多关于默认隐藏的鱼的更多信息,但是当我点击简单显示更多选项卡时,我想调用函数showdetails(fish.fish_id)
。 我的function看起来像这样:
$scope.showdetails = function(fish_id) { var fish = $scope.fish.get({id: fish_id}); fish.more = true; }
现在看来更多的细节出现了。 然而,通过search文件后,我无法弄清楚如何searchfish
arrays。
那么如何查询数组呢? 并在控制台中如何调用debugging器,以便我有$scope
对象来玩?
我知道这可以帮助你一点。
这是我试图为你模拟的东西。
检出jsFiddle;)
http://jsfiddle.net/migontech/gbW8Z/5/
创build了一个filter,你也可以在'ng-repeat'
app.filter('getById', function() { return function(input, id) { var i=0, len=input.length; for (; i<len; i++) { if (+input[i].id == +id) { return input[i]; } } return null; } });
控制器中的用法:
app.controller('SomeController', ['$scope', '$filter', function($scope, $filter) { $scope.fish = [{category:'freshwater', id:'1', name: 'trout', more:'false'}, {category:'freshwater', id:'2', name:'bass', more:'false'}] $scope.showdetails = function(fish_id){ var found = $filter('getById')($scope.fish, fish_id); console.log(found); $scope.selected = JSON.stringify(found); } }]);
如果有任何问题,请让我知道。
您可以使用现有的$筛选器服务。 我更新了上面的提琴http://jsfiddle.net/gbW8Z/12/
$scope.showdetails = function(fish_id) { var found = $filter('filter')($scope.fish, {id: fish_id}, true); if (found.length) { $scope.selected = JSON.stringify(found[0]); } else { $scope.selected = 'Not found'; } }
Angular文档在这里http://docs.angularjs.org/api/ng.filter:filter
要添加@ migontech的答案,他的地址他的评论,你可以“可能使它更通用”,这是一个办法做到这一点。 以下将允许您search任何财产:
.filter('getByProperty', function() { return function(propertyName, propertyValue, collection) { var i=0, len=collection.length; for (; i<len; i++) { if (collection[i][propertyName] == +propertyValue) { return collection[i]; } } return null; } });
filter的调用将会变成:
var found = $filter('getByProperty')('id', fish_id, $scope.fish);
请注意,我删除了一元(+)运算符,以允许基于string的匹配…
一个肮脏和简单的解决scheme可能会像
$scope.showdetails = function(fish_id) { angular.forEach($scope.fish, function(fish, key) { fish.more = fish.id == fish_id; }); };
Angularjs已经有filter选项来做到这一点, https: //docs.angularjs.org/api/ng/filter/filter
你的解决scheme是正确的,但不必要的复 您可以使用纯JavaScript的过滤function 。 这是你的模型:
$scope.fishes = [{category:'freshwater', id:'1', name: 'trout', more:'false'}, {category:'freshwater', id:'2', name:'bass', more:'false'}];
这是你的function:
$scope.showdetails = function(fish_id){ var found = $scope.fishes.filter({id : fish_id}); return found; };
你也可以使用expression式:
$scope.showdetails = function(fish_id){ var found = $scope.fishes.filter(function(fish){ return fish.id === fish_id }); return found; };
更多关于这个function: LINK
看到这个线程,但我想search与我的search不匹配的ID。 代码做到这一点:
found = $filter('filter')($scope.fish, {id: '!fish_id'}, false);