Di Angular, saya perlu mencari objek dalam array

114

Di Angular, saya memiliki sebuah objek yang mengembalikan banyak objek. Masing-masing memiliki ID (ini disimpan dalam file datar jadi tidak ada DB, dan saya sepertinya tidak dapat menggunakan ng-resource)

Di pengontrol saya:

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

Dalam pandangan saya, saya memiliki informasi tambahan tentang ikan yang tersembunyi secara default dengan ng-showmore, tetapi ketika saya mengklik tab show more yang sederhana, saya ingin memanggil fungsinya showdetails(fish.fish_id). Fungsi saya akan terlihat seperti ini:

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

Sekarang dalam tampilan, lebih banyak detail muncul. Namun setelah mencari melalui dokumentasi saya tidak tahu bagaimana mencari fisharray itu.

Jadi bagaimana cara menanyakan array? Dan di konsol, bagaimana saya memanggil debugger sehingga saya memiliki $scopeobjek untuk dimainkan?

tspore
sumber

Jawaban:

95

Saya tahu apakah itu bisa sedikit membantu Anda.

Ini adalah sesuatu yang saya coba simulasikan untuk Anda.

Lihat jsFiddle;)

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

Membuat filter yang juga bisa Anda gunakan dalam '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;
  }
});

Penggunaan dalam pengontrol:

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

Jika ada pertanyaan, beri tahu saya.

migontech.dll
sumber
Karena saya baru mengenal angular dan javascript, saya tidak mengerti arti '+' dalam pernyataan "if (+ input [i] .id == + id) {", bisakah Anda berbagi pemikiran.
Harshavardhan
Solusi Sempurna !!
Anil Kumar Ram
1
Saya pikir "+ masukan [i] .id == + id" memastikan Anda membandingkan angka. Jadi Anda dapat meneruskan 1 atau '1' ke $ filter dan itu akan berperilaku sama persis. Saya menggunakan ID alfanumerik, jadi saya mengubahnya menjadi "input [i] .id === id"
Axel Zehden
211

Anda dapat menggunakan layanan $ filter yang ada. Saya memperbarui biola di atas 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';
     }
 }

Dokumentasi sudut ada di sini http://docs.angularjs.org/api/ng.filter:filter

Adrian Gunawan
sumber
2
sangat membantu - Ketika saya belajar bersudut, saya menyadari bahwa saya harus berhenti memikirkan fungsi jQuery terlebih dahulu (mencoba mendapatkan $ .grep untuk melakukan ini) - alih-alih menggunakan layanan $ filter ini adalah yang saya butuhkan!
Bobby
2
Jawaban yang lebih baik karena tidak melibatkan penulisan filter Anda sendiri.
stevenw00
Bisakah Anda menambahkan detail apa $scope.selecteditu / berisi. Melakukan cepat-pencarian di dipilih saya menemukan ng-selected/ ngSelected: If the expression is truthy, then special attribute "selected" will be set on the element . Apakah ini sama? Dalam contoh Anda, apa fungsinya? Terima kasih
surfmuggle
1
Luar biasa!. Sederhanakan. Terima kasih
Bharath
2
Jangan lupa untuk menambahkan layanan $ filter ke pengontrol Anda. yaitu: app.controller ('mainController', ['$ filter', function ($ filter) {// $ filter sekarang dapat digunakan.}]);
Lucas Reppe Welander
22

Untuk menambah jawaban @ migontech dan juga alamatnya pada komentarnya bahwa Anda "mungkin bisa membuatnya lebih umum", berikut cara melakukannya. Di bawah ini akan memungkinkan Anda untuk mencari berdasarkan properti apa pun:

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

Panggilan untuk memfilter kemudian akan menjadi:

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

Catatan, saya menghapus operator unary (+) untuk memungkinkan pencocokan berbasis string ...

herringtown
sumber
mengingat dokumentasi menyatakan bahwa ini adalah satu-satunya kasus penggunaan untuk ng-init, saya akan mengatakan ini pasti cara Angular untuk melakukannya.
bluehallu
Sangat mudah untuk memahami contoh dan sangat membantu
rainabba
13

Solusi yang kotor dan mudah terlihat seperti itu

$scope.showdetails = function(fish_id) {
    angular.forEach($scope.fish, function(fish, key) {
        fish.more = fish.id == fish_id;
    });
};
Arun P Johny
sumber
5
Mengapa ini solusi yang kotor ?
Trialcoder
5
tebakan saya karena mungkin ada, seperti, satu miliar catatan ikan dan kami hanya mengulanginya satu per satu
RedactedProfile
6
Akan ada lebih banyak rekaman dalam bahasa lain. Maksud saya, ada banyak ikan di C ++. (Oh diam .. Aku akan pergi dan memilih diriku sendiri .. !!)
Mike Gledhill
7

Solusi Anda benar tetapi tidak perlu rumit. Anda dapat menggunakan fungsi filter javascript murni . Ini model Anda:

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

Dan inilah fungsi Anda:

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

Anda juga bisa menggunakan ekspresi:

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

Lebih lanjut tentang fungsi ini: LINK

Michał Jarzyna
sumber
4

Melihat utas ini tetapi saya ingin mencari ID yang tidak cocok dengan pencarian saya. Kode untuk melakukan itu:

found = $filter('filter')($scope.fish, {id: '!fish_id'}, false);
Ogglas
sumber
Ini berhasil untuk saya. Sederhana, apik, mudah diuji. Terima kasih!
Kalpesh Panchal