使用带控制器的自定义过滤器

时间:2015-11-10 15:48:50

标签: angularjs

我创建了一个过滤器,用于检查用户ID,然后过滤掉没有该用户ID的ng-repeat中的所有结果。

如果我放置过滤器,

UserService.getCurrentUser()
  .then(function(user_id){
    $scope.user_id = user_id;
});

在我的控制器中它工作正常,但我想让控制器保持尽可能干净,所以我想把它移出去。

我创建了一个名为“userFilter.js”的文件,这是代码,

angular.module('addMovieseat', [])

  .filter('user_filter', function() {
    UserService.getCurrentUser()
      .then(function(user_id){
        $scope.user_id = user_id;
    });
  });

但是当我将过滤器注入我的控制器时,我得到一个错误,

Error: [$injector:unpr] Unknown provider: user_filterProvider <- user_filter <- addMovieCtrl

这也是我获得当前用户ID的服务,

(function(){
  "use strict";

  angular.module('addMovieseat')

  .factory('UserService', function($http, $q){
    return{
      getCurrentUser: function(){
        var user_id = null,

        deferred = $q.defer();
        // Get the current user id and use it to filter out all movies that do not correspond to that id in the main overview.
        $http.get(('/users.json'),{ cache: true}).
          success(function (data, status, headers, config) {

            if (status == 200) {
               deferred.resolve(data.id);
            } else {
              deferred.resolve(false);
              console.error('Error happened while getting the user list.')
            }
        });

        return deferred.promise;
      }
    }
  });
})();

2 个答案:

答案 0 :(得分:2)

听起来好像在重复的项目上使用<li ng-repeat="movie in movies" ng-if="movie.user_id == user_id"></li> 可能会更好。喜欢这个

$scope.user_id

假设您的控制器中的$scope.user_id = 'Tim'; $scope.movies = [ {name: 'Movie Title 1', user_id: 'Tim'}, {name: 'Movie Title 2', user_id: 'Jane'}, {name: 'Movie Title 3', user_id: 'Bob'} ]; 是要检查的ID,并且您的电影列表是一个数组。像这样:

{{1}}

这只会使用user_id&#39; Tim&#39;。

呈现电影

编辑: Documentation for ng-if

编辑2 :根据OP的评论,更新代码以反映具体问题。

答案 1 :(得分:1)

我实际上认为你在寻找的是

<li ng-repeat="movie in movies|filter:{user_id:user:id}:strict"></li>

如此处所示 https://docs.angularjs.org/api/ng/filter/filter

使用ng-if可能会在某些情况下导致奇怪的行为,请务必阅读https://docs.angularjs.org/api/ng/directive/ngIf