将常见的代码添加到角滤波器模块中



我有3个过滤器,我需要为一个项目编写,所有3个都可以做同样的事情,但是与$ rootscope不同的数组(他们正在将数字状态转换为其显示值)。

如何编写此代码并从所有3个过滤器中调用它,然后将一个实例保存在MyFilters模块中?

我看不到可以放置该代码的地方。如果我正在写一项服务,我会有一个可以放入的块,但是有了过滤器,我没有那个共同的位置来编写代码。

现在,我刚刚将其移至全局范围,但是我想将其移至过滤器模块中,因此我不必重复3次或将其存储在全球范围中。

angular.module('myFilters', [])
.filter('aStatus', function($rootScope) {
    return function(id, attr) {
        var objectArray = $rootScope.appConfig.aStatuses,
            index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
        if(index < 0) {
            return "";
        }
        if(attr) {
            return objectArray[index][attr];
        }
        return objectArray[index];
    };
})
.filter('bStatus', function($rootScope) {
    return function(id, attr) {
        var objectArray = $rootScope.appConfig.aStatuses,
            index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
        if(index < 0) {
            return "";
        }
        if(attr) {
            return objectArray[index][attr];
        }
        return objectArray[index];
    };
})
.filter('cStatus', function($rootScope) {
    return function(id, attr) {
        var objectArray = $rootScope.appConfig.cStatuses,
            index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
        if(index < 0) {
            return "";
        }
        if(attr) {
            return objectArray[index][attr];
        }
        return objectArray[index];
    };
});

为什么不将通用函数提取到服务中,而只需使用预沿objectArray的过滤器调用它?

angular.module('myFilters', [])
.factory("StatusFilter", function ($rootScope) {
    return function(objectArray, id, attr) {
        var index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
        if(index < 0) {
            return "";
        }
        if(attr) {
            return objectArray[index][attr];
        }
        return objectArray[index];
    };
});
.filter('aStatus', function(StatusFilter, $rootScope) {
    return function(id, attr) {
        return StatusFilter($rootScope.appConfig.aStatuses, id, attr);
    };
})
.filter('bStatus', function(StatusFilter, $rootScope) {
    return function(id, attr) {
        return StatusFilter($rootScope.appConfig.bStatuses, id, attr);
    };
})
.filter('cStatus', function(StatusFilter, $rootScope) {
    return function(id, attr) {
        return StatusFilter($rootScope.appConfig.cStatuses, id, attr);
    };
})

另外,您可以将该功能提取到过滤器中:

angular.module('myFilters', [])
.filter("Status", function ($rootScope) {
    return function(objectArray, id, attr) {
        var index = _.findIndex(objectArray, function(obj) { return obj.id === id; });
        if(index < 0) {
            return "";
        }
        if(attr) {
            return objectArray[index][attr];
        }
        return objectArray[index];
    };
});
.filter('aStatus', function($filter, $rootScope) {
    return function(id, attr) {
        return $filter("Status")($rootScope.appConfig.aStatuses, id, attr);
    };
})
.filter('bStatus', function($filter, $rootScope) {
    return function(id, attr) {
        return $filter("Status")($rootScope.appConfig.bStatuses, id, attr);
    };
})
.filter('cStatus', function($filter, $rootScope) {
    return function(id, attr) {
        return $filter("Status")($rootScope.appConfig.cStatuses, id, attr);
    };
})

最新更新