在多个控制器中使用自定义过滤器(AngularJS)

时间:2014-11-20 17:56:03

标签: angularjs

我正在学习AngularJS并尝试转换现有网站以使用AngularJS组件。我有一个过滤器,显示我用于导航的顶级链接。我在多个控制器中使用它:

$scope.topLevelLinks = function(link) {
    if (link.parent_id == 0) {
        return link;
    }
};

当我将上面的代码添加到每个控制器时,当我调用它时,它完全符合我的要求:

<li data-ng-repeat="link in links | filter: topLevelLinks">

但是,我正在尝试将它添加到我的模块中,所以我不必在两个控制器中编写它,我似乎无法让它工作。我没有收到任何错误,只是没有过滤我的链接:

app.factory('NavigationService', ['$http', function($http) {

return {
    getLinks: function () {
        return $http({

            method: 'GET',
            url: '/navigation',
            headers: {
                'Content-Type': 'application/json'
            }
        });
    }
};

}]).filter('topLevelLinks', function() {

return function(link) {
    if (link.parent_id == 0) {
        return link;
    }
};

}).controller('NavigationCtrl', ['$scope', '$http', 'NavigationService', function ($scope, $http, $nav) {

$scope.links = [];

$nav.getLinks().success(function(data) {
    $scope.links = data;
});

$scope.hasChildren = function(link) {
    return link.children.length > 0;
};

}]).controller('NavigationAdminCtrl', ['$scope', '$http', 'NavigationService', function ($scope, $http, $nav) {

$scope.links = [];

$nav.getLinks().success(function(data) {
    $scope.links = data;
});

}]);

我将非常感谢能得到的任何帮助!

1 个答案:

答案 0 :(得分:0)

上面的内容不是过滤器,它只是控制器上的一种方法。

要创建过滤器,您可以执行以下操作:

angular.module('moduleName').filter('topLevelLinks', function(input){
  var output = [];
  for (var i=0; i<input.length; i++){
    if (input[i].parent_id == 0) {
        output.push(input[i]);
    }
  }
  return output;
});

然后你可以像这样使用它:

<li data-ng-repeat="link in links | filter: topLevelLinks">

您可以找到更多信息here