Trong Angular, tôi cần tìm kiếm các đối tượng trong một mảng


114

Trong Angular, tôi có trong phạm vi một đối tượng trả về rất nhiều đối tượng. Mỗi cái đều có một ID (cái này được lưu trữ trong một tệp phẳng nên không có DB và tôi dường như không thể sử dụng ng-resource)

Trong bộ điều khiển của tôi:

$scope.fish = [
    {category:'freshwater', id:'1', name: 'trout', more:'false'},
    {category:'freshwater', id:'2', name:'bass', more:'false'}
];

Theo quan điểm của tôi, tôi có thông tin bổ sung về cá bị ẩn theo mặc định với ng-shownhiều hơn, nhưng khi tôi nhấp vào tab hiển thị thêm đơn giản, tôi muốn gọi hàm showdetails(fish.fish_id). Hàm của tôi sẽ giống như sau:

$scope.showdetails = function(fish_id) {  
    var fish = $scope.fish.get({id: fish_id});
    fish.more = true;
}

Bây giờ trong giao diện, nhiều chi tiết hơn sẽ hiển thị. Tuy nhiên, sau khi tìm kiếm tài liệu, tôi không thể tìm ra cách tìm kiếmfish mảng .

Vậy làm cách nào để truy vấn mảng? Và trong bảng điều khiển, làm cách nào để gọi trình gỡ lỗi để tôi có $scopeđối tượng để chơi cùng?

Câu trả lời:


95

Tôi biết nếu điều đó có thể giúp bạn một chút.

Đây là một cái gì đó tôi đã cố gắng mô phỏng cho bạn.

Kiểm tra jsFiddle;)

http://jsfiddle.net/migontech/gbW8Z/5/

Đã tạo một bộ lọc mà bạn cũng có thể sử dụng trong '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;
  }
});

Sử dụng trong bộ điều khiển:

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);
     }
}]);

Nếu có bất kỳ câu hỏi chỉ cho tôi biết.


Vì tôi mới làm quen với góc cạnh và javascript nên tôi không hiểu ý nghĩa của '+' trong câu lệnh "if (+ input [i] .id == + id) {", bạn có thể vui lòng chia sẻ suy nghĩ của mình không.
Harshavardhan

Giải pháp hoàn hảo !!
Anil Kumar Ram

1
Tôi nghĩ rằng "+ input [i] .id == + id" đảm bảo rằng bạn đang so sánh các số. Vì vậy, bạn có thể chuyển 1 hoặc '1' vào bộ lọc $ và nó sẽ hoạt động theo cùng một cách. Tôi đang sử dụng id chữ và số, vì vậy tôi đã thay đổi nó thành "input [i] .id === id"
Axel Zehden

211

Bạn có thể sử dụng dịch vụ bộ lọc $ hiện có. Tôi đã cập nhật fiddle ở trên 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';
     }
 }

Tài liệu về Angular tại đây http://docs.angularjs.org/api/ng.filter:filter


2
rất hữu ích - Khi tôi tìm hiểu góc cạnh, tôi nhận ra rằng trước tiên tôi cần phải ngừng suy nghĩ các hàm jQuery (đang cố gắng lấy $ .grep để thực hiện việc này) - thay vì sử dụng dịch vụ $ filter này mới là thứ tôi cần!
Bobby

2
Câu trả lời tốt hơn vì nó không liên quan đến việc viết bộ lọc của riêng bạn.
stevenw00

Bạn có thể thêm chi tiết những gì $scope.selectedlà / chứa. Làm một cách nhanh chóng tìm kiếm trên chọn tôi tìm thấy ng-selected/ ngSelected: If the expression is truthy, then special attribute "selected" will be set on the element . Điều này có giống nhau không? Trong ví dụ của bạn, nó làm gì? Cảm ơn
lướt web

1
Tuyệt vời !. Làm cho nó đơn giản. Cảm ơn
Bharath

2
Đừng quên thêm dịch vụ $ filter vào bộ điều khiển của bạn. tức là: app.controller ('mainController', ['$ filter', function ($ filter) {// $ filter hiện có thể được sử dụng.}]);
Lucas Reppe Welander

22

Để thêm vào câu trả lời của @ migontech và cũng là địa chỉ nhận xét của anh ấy rằng bạn có thể "có thể làm cho nó chung chung hơn", đây là một cách để làm điều đó. Dưới đây sẽ cho phép bạn tìm kiếm theo bất kỳ tài sản nào:

.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;
    }
});

Lệnh gọi bộ lọc sau đó sẽ trở thành:

var found = $filter('getByProperty')('id', fish_id, $scope.fish);

Lưu ý, tôi đã xóa toán tử một ngôi (+) để cho phép đối sánh dựa trên chuỗi ...


Xem xét các tài liệu nói rằng đây là trường hợp sử dụng duy nhất cho ng-init, tôi sẽ nói đây chắc chắn là cách Angular để làm điều đó.
bluehallu

Rất dễ hiểu ví dụ và rất hữu ích
rainabba

13

Một giải pháp bẩn và dễ dàng có thể trông giống như

$scope.showdetails = function(fish_id) {
    angular.forEach($scope.fish, function(fish, key) {
        fish.more = fish.id == fish_id;
    });
};

5
Tại sao đây là một dung dịch bẩn ?
Trialcoder

5
đoán của tôi sẽ vì có thể có, như, một tỷ hồ sơ cá và chúng tôi chỉ lặp qua từng cái một
RedactedProfile

6
Thậm chí còn có nhiều bản ghi bằng các ngôn ngữ khác. Ý tôi là, có rất nhiều cá trong C ++. (Ồ, im đi .. Tôi sẽ tự mình đi bỏ phiếu .. !!)
Mike Gledhill


7

Các giải pháp của bạn là đúng nhưng phức tạp không cần thiết. Bạn có thể sử dụng chức năng lọc javascript thuần túy . Đây là mô hình của bạn:

     $scope.fishes = [{category:'freshwater', id:'1', name: 'trout', more:'false'},  {category:'freshwater', id:'2', name:'bass', more:'false'}];

Và đây là chức năng của bạn:

     $scope.showdetails = function(fish_id){
         var found = $scope.fishes.filter({id : fish_id});
         return found;
     };

Bạn cũng có thể sử dụng biểu thức:

     $scope.showdetails = function(fish_id){
         var found = $scope.fishes.filter(function(fish){ return fish.id === fish_id });
         return found;
     };

Thông tin thêm về chức năng này: LINK


4

Đã thấy chuỗi này nhưng tôi muốn tìm kiếm các ID không khớp với tìm kiếm của tôi. Mã để làm điều đó:

found = $filter('filter')($scope.fish, {id: '!fish_id'}, false);

Điều này đã làm việc cho tôi. Đơn giản, bóng bẩy, dễ kiểm tra. Cảm ơn!
Kalpesh Panchal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.