как создать пользовательский фильтр на стороне контроллера javascript angularjs?

как создать пользовательский фильтр на стороне контроллера javascript angularjs? я хотел бы выполнить поиск в массиве, называемом сегментами, по SegmentId, чтобы создать фильтр, который выполняет поиск foreach в массиве сегментов по SegmentId -

    //Controller

    $scope.GetSegmentDetails = function (id) {
        $scope.SegmentName = $filter('SegmentById')($scope.segments,id);
    }


    //Filter
    app.filter('SegmentById', function () {
        return function (input, searchPerson) {
        if (!searchPerson)
            return input;

        var results = [];
        angular.forEach(input, function (person) {
        }
    });

    return results;
}

});


person hod caspi    schedule 04.11.2014    source источник
comment
пожалуйста, опубликуйте пример модели (например, $scope.segments)   -  person boindiil    schedule 04.11.2014
comment
Я не понимаю, вы хотите создать фильтр, чтобы поместить логику в контроллер? тогда вам не нужен фильтр, вы можете сделать это прямо в контроллере, фильтры используются для фильтрации отображаемых данных, привязанных к HTML   -  person Charlie    schedule 04.11.2014
comment
@boindiil [{SegmentId:1,Description:hod Registrations}, {SegmentId:2,Description:hod Inactive}, {SegmentId:3,Description:hod testUpd}, {SegmentId:8,Description:hod test}, {SegmentId: 1111,Описание:hod Release}, {SegmentId:12,Description:hod Requests}, {SegmentId:13,Description:hod Добро пожаловать}]   -  person hod caspi    schedule 04.11.2014
comment
@Charlie Чарли, да, я знаю, что могу сделать это напрямую как приватную функцию, также необходимо сделать это на самой странице, та же функциональность ...   -  person hod caspi    schedule 04.11.2014
comment
о, хорошо, вы пытались импортировать объект фильтра вашего углового модуля в свой контроллер? потому что я не уверен, что компоненты в модуле неявно знают друг о друге, не уверен, как это сделать, но вы должны найти что-то с помощью Google   -  person Charlie    schedule 04.11.2014


Ответы (2)


Вам не нужно писать свой единственный фильтр для фильтрации по SegmentId. Вот вам пример

function MyCtrl($scope, $filter) {
  $scope.data = [{"SegmentId":"1","Description":"hod Registrations"}, {"SegmentId":"2","Description":"hod Inactive"}, {"SegmentId":"3","Description":"hod testUpd"}, {"SegmentId":"8","Description":"hod test"}, {"SegmentId":"1111","Description":"hod Release"}, {"SegmentId":"12","Description":"hod Requests"}, {"SegmentId":"13","Description":"hod Welcome Back"}]
  
  $scope.filterData = function(segmentId) {
    return $filter('filter')($scope.data, { SegmentId: segmentId });
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<div ng-app ng-controller="MyCtrl">
  Full:
  <ul>
    <li ng-repeat="Segment in data">
      {{Segment.SegmentId}}
    </li>
  </ul>
  Filtered in View:
  <ul>
    <li ng-repeat="Segment in data | filter:{SegmentId:1111}">
      {{Segment.SegmentId}}
    </li>
  </ul>
  Filtered in Controller:
  <ul>
    <li ng-repeat="Segment in filterData(1111)">
      {{Segment.SegmentId}}
    </li>
  </ul>
</div>

person boindiil    schedule 04.11.2014
comment
Большое спасибо! работает отлично, у меня есть еще одна проблема с порядком загрузки модуля в контроллер. что означает, что $filter должен быть вторым после $scope - person hod caspi; 05.11.2014
comment
Взгляните на эту ссылку - person boindiil; 05.11.2014
comment
@boindiil Как добиться SegmentId !== segmentId с помощью $filter? - person gaurav bhavsar; 25.08.2015
comment
@gauravbhavsar Вы можете использовать отрицание внутри фильтра - person boindiil; 25.08.2015
comment
@boindiil (+1) Спасибо :) - person gaurav bhavsar; 26.08.2015

Нужно только добавить в свой контроллер зависимость фильтра, а затем вызвать ее.

app.controller("YourController", ['$scope', '$filter', function ($scope, $filter){

$filter('filterName')($args));

}]);
person Juan José González    schedule 09.12.2015