2015-11-19 3 views
0

Я хочу отфильтровать коллекцию заказов по поисковому объекту. хотите показать только соответствующий порядок в представлении.Как выполнить поиск по объекту с вложенным объектом в AngularJS

У меня есть заказы коллекция массив как:

$scope.orders = [{ 
    "_id" : "56461e2b7caaf49345076709", 
    "customer" : {"_id": "76461e2b7caaf49345076a19b", "name": "cr1"}, 
    "seller" : {"_id": "96461e2b7caaf49345076a18b", "name": "sl1"}, 
    "address" : "Squire Park", 
    "qt" : 5 
}, 
{ 
    "_id" : "56461e2b7caaf49345076708", 
    "customer" : {"_id": "76461e2b7caaf49345076a19b1", "name": "cr2"}, 
    "seller" : {"_id": "96461e2b7caaf49345076a18c1", "name": "sl2"}, 
    "address" : "Squire Park1", 
    "qt" : 6 
}, 
.................. 
]; 

и мой поиск объект как:

$scope.search = { 
    "qt": 5, 
    "customer" : {"_id": "76461e2b7caaf49345076a19b1"}, 
    "seller" : {"_id": "96461e2b7caaf49345076a18c1"} 
}; 

вид:

<tr data-ng-repeat="order in orders | myFilter:search"> 
     <td>{{order._id}}</td> 
     <td>{{order.customer.name}}</td> 
</tr> 

Что должно быть моим myFilter функция?

Спасибо заранее.

ответ

0

Довольно простое решение будет подключая функцию фильтра в рамках

$scope.orderFilter = function(order) { 
    // implementation depends on how you want the search to behave 
    // for example, if the order should match every property of the searchObj 
    var pass = true; 
    for (var property in $scope.search) { 
    if ($scope.search.hasOwnProperty(property)) { 
     if($scope.search[property] != order[property]) { 
     pass = false; 
     } 
    } 
    } 
    return pass; 
    // .. though i wouldnt recommend this implementation 
    // you´d be better off by implementing a more specific matching 
} 

И по мнению

<tr data-ng-repeat="order in orders | filter:orderFilter"> 
    <td>{{order._id}}</td> 
    <td>{{order.customer.name}}</td> 
</tr> 

Если вы хотите, чтобы фильтр-выражение, которое вы используете для работы , вы должны зарегистрировать настраиваемый фильтр в своем модуле. Это будет сделано так:

angular.module('app').filter('myFilter', function() { 
    return function(orders, searchObj) { 
    var filteredOrders = []; 
    orders.forEach(function(order) { 
     // evaluate if you want to have the order show up based on the searchOjb 
     // .. if so, add it to the array like so: 
     filteredOrders.push(order); 
    }); 
    return filteredOrders; 
    } 
}); 

ПРИМЕЧАНИЕ

Если изменить свойство вас поиск объекта, ваша функция фильтра обыкновения называться снова, потому что угловые фильтры Арента прослушивают изменения вложенных свойств. Фильтр будет вызываться только при изменении всего объекта поиска.