2013-08-29 22 views
7

Ho in oggetto nidificato angolare come questo. c'è modo per filtrare per proprietà nidificatoAngularjs filtro nidificato oggetto

<li ng-repeat="shop in shops | filter:search"> 
search.locations.city_id = 22 

sto mostrando solo elemento padre, ma vuole filtrare per entrambi di esso, come:

search = 
    category_id: 2 
    locations: 
    city_id: 368 

[ 
name: "xxx" 
category_id: 1 
locations: [ 
    city_id: 368 
    region_id: 4 
    , 
    city_id: 368 
    region_id: 4 
    , 
    city_id: 368 
    region_id: 4 
    ] 
, 
name: "xxx" 
category_id: 2 
locations: [ 
    city_id: 30 
    region_id: 4 
    , 
    city_id: 22 
    region_id: 2 
    ] 
] 

risposta

8

Sì, è possibile, se io capito bene il tuo esempio

A seconda della dimensione della raccolta, potrebbe essere meglio calcolare la raccolta su cui si sta eseguendo l'iterazione in ng-repeat in modo che il filtro non lo stia facendo costantemente mentre il modello cambia.

http://jsfiddle.net/suCWn/

Fondamentalmente è fare qualcosa di simile, se ho capito bene:

$scope.search = function (shop) { 

    if ($scope.selectedCityId === undefined || $scope.selectedCityId.length === 0) { 
     return true; 
    } 

    var found = false; 
    angular.forEach(shop.locations, function (location) {   
     if (location.city_id === parseInt($scope.selectedCityId)) { 
      found = true; 
     } 
    }); 

    return found; 
}; 
23

È inoltre possibile filtrare come questo (versione 1.2.13+)

<li ng-repeat="shop in shops | filter: { locations: [{ city_id: search.locations.city_id }] }"> 
+1

bene questo funziona, ma di default risultati non sono mostrati solo dopo ingresso. http://jsfiddle.net/suCWn/12/ – zajca

+1

Ho leggermente modificato il tuo violino: [link] (http://jsfiddle.net/suCWn/15/) – martinoss

+2

@zajca puoi risolvere il problema assegnando un valore al modello nel controller : '$ scope.selectedCityId = '''. Questo ha l'effetto di caricare tutti gli elementi prima di modificare manualmente l'input –

0

Aggiornato Risposta "Parole come Jared" per utilizzare le espressioni regolari per verificare se contiene il punto di ricerca. Così inizia filtraggio quando si digita 1 numero in modo da non dover corrispondere l'intera parola

JSfiddle

angular.forEach(shop.locations, function (location) {   
     if (checknum(location.city_id)) { 
      found = true; 
     } 
    }); 

    function checknum(num){ 
     var regx = new RegExp($scope.selectedCityId); 
     return regx.test(num); 
    };