2013-08-29 17 views
7

Mam w kątowy obiekt zagnieżdżony w ten sposób. jest tam sposób jak filtrować je na własność zagnieżdżonegoObiekt zagnieżdżony Angularjs filtr

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

Jestem pokazując tylko elementu nadrzędnego, ale chcesz filtrować zarówno przez niego, jak:

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 
    ] 
] 

Odpowiedz

8

Tak, można, gdybym dobrze zrozumiał twój przykład.

W zależności od wielkości kolekcji może być lepiej wyliczyć kolekcję, którą poddajesz iteracji w ng-repeat, aby filtr nie robił tego w sposób ciągły wraz ze zmianą modelu.

http://jsfiddle.net/suCWn/

Zasadniczo można zrobić coś takiego, jeśli ja zrozumiałem:

$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

Można również filtrować tak (wersja 1.2.13+)

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

dobrze to działa, ale domyślnie wyniki nie są wyświetlane dopiero po wejściu. http://jsfiddle.net/suCWn/12/ – zajca

+1

Ja nieznacznie zmodyfikowałem twoje skrzypce: [link] (http://jsfiddle.net/suCWn/15/) – martinoss

+2

@zajca możesz obejść, przypisując modelowi wartość w kontrolerze : '$ scope.selectedCityId = '''. To powoduje ładowanie wszystkich elementów przed ręczną zmianą wejścia –

0

Aktualizowane Odpowiedź "Words Like Jared" na użycie wyrażeń regularnych w celu sprawdzenia, czy zawiera on wyszukiwarkę. W ten sposób rozpoczyna filtrowanie po wpisaniu numeru w 1, dzięki czemu nie trzeba dopasować cały wyraz

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); 
    }; 
Powiązane problemy