В Angular мне нужно искать объекты в массиве
В Angular у меня есть в области объект, который возвращает много объектов. У каждого есть идентификатор (он хранится в плоском файле, поэтому нет DB, и я, кажется, не могу использовать ng-resource
)
В моем контроллере:
$scope.fish = [
{category:'freshwater', id:'1', name: 'trout', more:'false'},
{category:'freshwater', id:'2', name:'bass', more:'false'}
];
На мой взгляд, у меня есть дополнительная информация о рыбе, скрытой по умолчанию, с ng-show
больше, но когда я нажимаю кнопку "Показать больше", я бы хотел вызвать функцию showdetails(fish.fish_id)
.
Моя функция будет выглядеть примерно так:
$scope.showdetails = function(fish_id) {
var fish = $scope.fish.get({id: fish_id});
fish.more = true;
}
Теперь в представлении отображается более подробная информация. Однако после поиска документации я не могу понять, как искать этот массив fish
.
Итак, как мне запросить массив? И в консоли, как я могу вызвать отладчик, чтобы у меня был объект $scope
для воспроизведения?
Ответы
Ответ 1
Я знаю, если это может вам помочь.
Вот что я пытался имитировать для вас.
Оформить заказ jsFiddle;)
http://jsfiddle.net/migontech/gbW8Z/5/
Создал фильтр, который вы также можете использовать в '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);
}
}]);
Если есть какие-либо вопросы, просто дайте мне знать.
Ответ 2
Вы можете использовать существующую службу $filter. Я обновил скрипку выше 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
Ответ 3
Чтобы добавить к ответу @migontech, а также его адрес, его комментарий, что вы могли бы "вероятно сделать его более общим", вот способ сделать это. Ниже вы можете искать по любому свойству:
.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;
}
});
Тогда вызов фильтра будет следующим:
var found = $filter('getByProperty')('id', fish_id, $scope.fish);
Заметьте, я удалил унарный (+) оператор, чтобы разрешить совпадения на основе строк...
Ответ 4
Грязное и простое решение может выглядеть как
$scope.showdetails = function(fish_id) {
angular.forEach($scope.fish, function(fish, key) {
fish.more = fish.id == fish_id;
});
};
Ответ 5
У Angularjs уже есть опция фильтра, чтобы сделать это,
https://docs.angularjs.org/api/ng/filter/filter
Ответ 6
Ваши решения правильны, но излишне сложны. Вы можете использовать функцию чистого фильтра javascript. Это ваша модель:
$scope.fishes = [{category:'freshwater', id:'1', name: 'trout', more:'false'}, {category:'freshwater', id:'2', name:'bass', more:'false'}];
И это ваша функция:
$scope.showdetails = function(fish_id){
var found = $scope.fishes.filter({id : fish_id});
return found;
};
Вы также можете использовать выражение:
$scope.showdetails = function(fish_id){
var found = $scope.fishes.filter(function(fish){ return fish.id === fish_id });
return found;
};
Подробнее об этой функции: LINK
Ответ 7
Пила этот поток, но я хотел найти идентификаторы, которые не совпадали с моим поиском. Код для этого:
found = $filter('filter')($scope.fish, {id: '!fish_id'}, false);