16

我为我的 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']);

我究竟做错了什么?

4

1 回答 1

34

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

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
        }
    }
});
于 2013-02-25T07:46:45.487 回答