Ошибка фильтра Angularjs: "Ошибка: неизвестный поставщик: textProvider"

Я создал собственный фильтр для моего проекта 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

Если вы посмотрите на код в этом 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
        }
    }
});