2013-08-29 50 views
7

Tôi có đối tượng lồng nhau góc cạnh như thế này. là có cách làm thế nào để lọc nó cho bất động sản lồng nhauBộ lọc Angularjs đối tượng lồng nhau

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

Tôi chỉ hiển thị yếu tố phụ huynh nhưng muốn lọc theo cả của nó, như:

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

Trả lời

8

Vâng, bạn có thể, nếu tôi hiểu rõ ví dụ của bạn.

Tùy thuộc vào kích cỡ bộ sưu tập của bạn, có thể tốt hơn để tính bộ sưu tập bạn lặp lại trong ng-repeat để bộ lọc không hoạt động liên tục khi mô hình thay đổi.

http://jsfiddle.net/suCWn/

Về cơ bản bạn làm điều gì đó như thế này, nếu tôi hiểu bạn một cách chính xác:

$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

Bạn cũng có thể lọc như thế này (phiên bản 1.2.13+)

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

tốt này đang làm việc, nhưng theo mặc định kết quả không được hiển thị chỉ sau khi nhập. http://jsfiddle.net/suCWn/12/ – zajca

+1

Tôi hơi sửa đổi fiddle của bạn: [link] (http://jsfiddle.net/suCWn/15/) – martinoss

+2

@zajca bạn có thể giải quyết bằng cách gán mô hình một giá trị trong bộ điều khiển : '$ scope.selectedCityId = '''. Điều đó có tác dụng tải tất cả các mục trước khi thay đổi đầu vào theo cách thủ công –

0

cập nhật "Words Like Jared" trả lời để sử dụng cụm từ thông dụng để kiểm tra xem nó có chứa searchterm hay không. Bằng cách này bắt đầu lọc khi bạn nhập vào 1 số, do đó bạn không cần phải phù hợp với toàn bộ từ

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); 
    }; 
Các vấn đề liên quan