“状态”是指在整个应用程序中设置的变量/属性/等。这些值有可能在任何给定时间发生变化。文档说过滤器不应该依赖于外部“状态”。过滤器需要知道的任何内容都应该在过滤时作为参数传入,然后过滤器应该具有执行过滤所需的一切并返回结果查看文档中的演示,您将在“有状态”过滤器,过滤器依赖于它用来进行过滤的服务。该服务值可能会在 $digest 循环期间发生变化,因此必须在过滤器上设置 $stateful 属性,以便 Angular 再次运行过滤器以确保依赖关系没有改变状态,这会改变过滤器的结果。
所以,所有的“状态”都应该在参数中,像这样:
<p>{{myData | multiplyBy:multiplier}}</p>
使用如下过滤器:
.filter('multiplyBy', function() {
function filter(input, multiplier) {
return input * multiplier;
}
return filter;
})
如果数据或参数发生变化,过滤器将再次运行。
stateful 版本是这样的(不推荐!):
<p>{{myData | myFilter}}</p>
过滤器从外部来源获取所需的信息:
.filter('myFilter', ['someDependency', function(someDependency) {
function filter(input) {
// let's just say `someDependency = {multiplier: 3}`
return input * someDependency.multiplier;
}
filter.$stateful = true;
return filter;
}])
在该示例过滤器中,someDependency.multiplier 应该作为参数传递给过滤器(如第一个示例中所示),而不是作为过滤器的依赖项。
进一步澄清问题:如果你调用这样的函数:foo(20) 并得到40 的结果,如果你重复这个过程,你应该得到相同的结果。如果你再次调用foo(20) 并得到92,那会很混乱,对吧?假设 foo 不是用于返回随机值的函数,它每次返回不同数字的唯一方法是它基于隐藏状态执行不同的操作(内部发生变化,而不是作为参数传入)。每次给定相同参数时,函数都会返回相同的想法称为“幂等”。
注意:$stateful 似乎是 Angular 1.3 中的新功能