Angularjs过滤错误:“错误:未知提供者:textProvider”

时间:2013-02-25 07:35:59

标签: javascript angularjs

我为angularjs项目创建了一个自定义过滤器,类似于以下小提琴http://jsfiddle.net/tUyyx/

myapp.filter('truncate',function(text,length){
    var end = "..."
    text = text.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
    if (isNaN(length))
     length = 23;



    if (text.length <= length || text.length - end.length <= length) {
        return text;
    }
    else {
        return String(text).substring(0, length-end.length) + end;
    }

});

但是当我使用过滤器时,我收到以下错误

Error: Unknown provider: textProvider <- text <- truncateFilter
    at Error (<anonymous>)
    at http://localhost/javascripts/lib/angular.min.js:28:236
    at Object.c [as get] (http://localhost/javascripts/lib/angular.min.js:26:13)
    at http://localhost/javascripts/lib/angular.min.js:28:317
    at c (http://localhost/javascripts/lib/angular.min.js:26:13)
    at Object.d [as invoke] (http://localhost/javascripts/lib/angular.min.js:26:147)
    at http://localhost/javascripts/lib/angular.min.js:28:335
    at Object.c [as get] (http://localhost/javascripts/lib/angular.min.js:26:13)
    at http://localhost/javascripts/lib/angular.min.js:99:481
    at o (http://localhost/javascripts/lib/angular.min.js:66:471) 

我已经创建了这样的模块。

var myapp = angular.module('myapp', ['ngResource']);

我做错了什么?

1 个答案:

答案 0 :(得分:34)

如果查看jsFiddle中的代码,该过滤器函数将返回一个以text等为参数的函数。它应该是这样的:

myapp.filter('truncate',function(){
    return function(text, length) {
        var end = "..."
        text = text.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();});
        if (isNaN(length))
         length = 23;



        if (text.length <= length || text.length - end.length <= length) {
            return text;
        }
        else {
            return String(text).substring(0, length-end.length) + end;
        }
    }
});

您获得“未知提供者:textProvider”的原因是您将text作为过滤器的参数。这使得Angular寻找一种名为text的服务,该服务不存在。这是您返回的以text为参数的函数。

可以这样想,第一个函数(传递给angular.filter的函数)是首先创建过滤器的函数。该功能仅在您的应用程序中执行一次。该函数的职责是创建另一个函数并返回它,它返回的函数是你的过滤器。你有一个函数返回一个函数的原因是让你根据你的系统返回不同的实现。也许是这样的:

myapp.filter('truncate', function(myService) {
    if (myService.someCondition()) {
        return function(text, length) {
            // return the text as usual
        }
    } else {
        return function(text, length) {
            // return the text and do some other things as well
        }
    }
});