In the end, I decided this :)
directive:
angular.module('dynamicFiltersDirective', []) .directive('dynamicFilters', function() { return { restrict: 'AE', scope: { filtersArray: '=', searchObject: '=' }, link: function(scope) { scope.addFilter = function() { var newItemNo = scope.filtersArray.length+1; scope.filtersArray.push({'id':'filter'+newItemNo}); }; scope.removeFilter = function(option) { var lastItem = scope.filtersArray.length-1; scope.filtersArray.splice(lastItem); delete scope.searchObject[option]; }; scope.updateFilters = function (model) { scope.searchObject[model]; } }, templateUrl: 'filtertemplate.html' } });
controller:
angular.module('app', ['dynamicFiltersDirective']).controller('resultsCtrl', function($scope){ $scope.filters = [{id: 'filter1'}]; $scope.search = {}; $scope.persons = [{ name: 'Jim', age: 21, customerId: 1, productId: 4 },{ name: 'Frank', age: 20, customerId: 2, productId: 4 },{ name: 'Bob', age: 20, customerId: 3, productId: 5 },{ name: 'Bill', age: 20, customerId: 3, productId: 5 }]; });
template:
<div data-ng-repeat="filter in filtersArray"> <select ng-model="filter.id"> <option value="age">Age</option> <option value="customerId">CustomerID</option> <option value="productId">ProductID</option> <option value="name">Name</option> </select> <input type="text" ng-model="searchObject[filter.id]" ng-change="updateFilters(searchObject[filter.id])"> <button class="remove" ng-show="$last" ng-click="removeFilter(filter.id)">-</button> </div> <button class="addfields" ng-click="addFilter()">Add fields</button> <div id="filtersDisplay"> {{ filters }} </div>
index.html
<div ng-controller="resultsCtrl"> <dynamic-filters filters-array="filters" search-object="search"> </dynamic-filters> <div ng-repeat="person in persons | filter: search"> {{person.name}} </div>
Here is my plnkr example
user1532669 01 Oct '15 at 23:52 2015-10-01 23:52
source share