2013-02-25 34 views
16

Aşağıdaki fiddle http://jsfiddle.net/tUyyx/ benzer angularjs projem için özel bir filtre oluşturdu. Filtreyi kullandığınızdaAngularjs filtre hatası: "Hata: Bilinmeyen sağlayıcı: textProvider"

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; 
    } 

}); 

ama şu hatayı

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) 

Bu gibi benim modülü oluşturduk olsun.

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

Neyi yanlış yapıyorum?

cevap

34

Bu jsFiddle'taki koda bakarsanız, bu filtre işlevi, bir argüman olarak text vb. Alan bir işlevi döndürür. Elindeki

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; 
     } 
    } 
}); 

nedeni "Bilinmeyen sağlayıcı: textProvider" Eğer filtreye bir argüman olarak text var çünkü Böyle bir şey olmalıdır. Bu, açısal olmayan text adı verilen bir hizmeti arar. Geri döndürdüğünüz işlev, text'u bir argüman olarak alır.

Bu şekilde düşünün, ilk işlev (angular.filter öğesinden geçirdiğiniz), önce filtreyi oluşturan işlevdir. Bu işlev sadece uygulamanızda bir kez yürütülür. Bu işlevin sorumluluğu başka bir işlev oluşturmak ve geri döndürmektir ve döndürdüğü işlev filtrenizdir. Bir işlevi döndüren bir işleviniz olması, sisteminize bağlı olarak farklı uygulamaları döndürmenize izin vermektir. Belki de böyle bir şey:

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 
     } 
    } 
}); 
İlgili konular