Jojo
Jojo

Reputation: 127

Angular custom search filter

I need to create a custom search filter for this scope. I tried the default filter function , doesn't works, Because I displayed status as string in HTML and it is not filtered the way I want it. If I type Normal in the textbox, nothing happens because the data is 0, 1 and 2. And if I search the purchase time which is in 2016/05/16 format cannot search also.

$scope.orderHistory = {[
    "purchaseTime": 1437536718345,
    "status": 1,
]};
app.filter('filterSearch', function () {
  //what to do here??
});


<input type="text" ng-model="searchReview">

<div dir-paginate="order in orderHistory|filterSearch:searchReview">
<ul>
 <li><p class="table-data2-h">{{ order.purchaseTime | date : 'yyyy/MM/dd'}} </p></li>
<li>
<span ng-if="order.status == 0 ">Stable</span>
<span ng-if="order.status == 1 ">Normal</span>
<span ng-if="order.status == 2 ">Serious</span>
</li>
</div>

Upvotes: 0

Views: 819

Answers (1)

developer033
developer033

Reputation: 24874

At first, I saw some mistakes on your code, you can compare it below.

I'd suggest you to create a simple function to parse your properties accordingly your requirements only on initilization (which one for sure will be better to parse everytime when than custom filter is called), then you can use the normal filter.

See it working:

(function() {
  'use strict';

  angular
    .module('app', [])
    .constant('STATUS', {
      0: 'Stable',
      1: 'Normal',
      2: 'Serious'
    })
    .controller('MainCtrl', MainCtrl);

  MainCtrl.$inject = ['$scope', 'STATUS'];

  function MainCtrl($scope, STATUS) {
    $scope.orderHistory = [
      {
        "purchaseTime": 1437536718345,
        "status": 1
      },
      {
        "purchaseTime": 1431236718345,
        "status": 0
      },
      {
        "purchaseTime": 1099536718345,
        "status": 2
      },
      {
        "purchaseTime": 1439744718345,
        "status": 1
      }
    ];

    function parseProperties() {
      $scope.orderHistory.map(function(order) {
        // You can do it with switch statement
        // switch (order.status) {
        //   case 0:
        //     order.status = 'Stable';
        //     break;
        //   case 1:
        //     order.status = 'Normal';
        //     break;
        //   case 2:
        //     order.status = 'Serious';
        //     break;
        // }

        // or using a constant that you can define above
        order.status = STATUS[order.status];

        order.purchaseTime = new Date(order.purchaseTime).toLocaleDateString();
        return order;
      });
    }

    parseProperties();
  }
})();
<!DOCTYPE html>
<html ng-app="app">

<head>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
</head>

<body ng-controller="MainCtrl">
  <input type="text" placeholder="Search..." ng-model="searchReview">
  <div ng-repeat="order in orderHistory | filter: searchReview">
    <ul>
      <li>
        <p class="table-data2-h" ng-bind="order.purchaseTime"></p>
      </li>
      <li ng-bind="order.status"></li>
    </ul>
  </div>
</body>

</html>

I hope it helps

Upvotes: 2

Related Questions