你的第一个过滤器

过滤器是一种特殊类型的函数,可以修改某些内容打印到页面的方式,或者可以用于过滤数组或 ng-repeat 操作。你可以通过调用 app.filter() 方法创建过滤器,并为其传递名称和函数。有关语法的详细信息,请参阅以下示例。

例如,让我们创建一个过滤器,将一个字符串更改为全部大写(基本上是 .toUpperCase() javascript 函数的包装器):

var app = angular.module("MyApp", []);

// just like making a controller, you must give the
// filter a unique name, in this case "toUppercase"
app.filter('toUppercase', function(){
    // all the filter does is return a function,
    // which acts as the "filtering" function
    return function(rawString){
        // The filter function takes in the value,
        // which we modify in some way, then return
        // back.
        return rawString.toUpperCase();
    };
}); 

让我们仔细看看上面发生的事情。

首先,我们创建一个名为 toUppercase 的过滤器,它就像一个控制器; app.filter(...)。然后,该过滤器的函数返回实际的过滤器函数。该函数接受一个对象,即要过滤的对象,并应返回该对象的过滤版本。

注意: 在这种情况下,我们假设传递给过滤器的对象是一个字符串,因此知道总是只对字符串使用过滤器。话虽这么说,可以对过滤器进行进一步改进,循环遍历对象(如果它是一个数组),然后使每个元素都是一个字符串大写。

现在让我们使用我们的新过滤器。我们的过滤器可以以两种方式使用,可以是角度模板,也可以是 javascript 函数(作为注入的 Angular 引用)。

使用 Javascript

只需将角度 $filter 对象注入控制器,然后使用它来使用其名称检索过滤器功能。

app.controller("MyController", function($scope, $filter){
    this.rawString = "Foo";
    this.capsString = $filter("toUppercase")(this.rawString);
});

HTML

对于 angular 指令,请在实际字符串后面的指令中使用 pipe(|)符号,后跟过滤器名称。例如,假设我们有一个名为 MyController 的控制器,它有一个名为 rawString 的字符串作为它的元素。

<div ng-controller="MyController as ctrl">
    <span>Capital rawString: {{ ctrl.rawString | toUppercase }}</span>
</div>

编者按: 角有很多内置的过滤器,包括大写,和 toUppercase 过滤器仅作为一个演示轻松地炫耀过滤器是怎样工作的,但你并不需要建立自己的大写功能。