什么是AngularJS中的状态过滤?

我正在阅读AngularJS开发人员指南,并在“filter”部分( https://docs.angularjs.org/guide/filter#stateful-filters )中看到“状态filter”。

给出这个描述:

强烈build议编写有状态的filter,因为Angular不能优化这些filter的执行,这往往会导致性能问题。 许多有状态的filter可以转换成无状态的filter,只需将隐藏状态作为模型公开,并将其变为filter的参数。

我不熟悉Web开发,所以不知道什么是有状态过滤,Angular文档也没有解释它:(请问有人可以解释一个普通的filter和一个有状态的filter是什么区别?

“状态”是指整个应用程序中设置的variables/属性/等。 这些值有可能在任何时候改变。 文件是说filter不应该依赖于外部的“状态”。 filter需要知道的任何内容都应在过滤时作为parameter passing,然后filter应该拥有所需的所有内容来执行过滤并返回结果查看文档中的演示,您将看到在“有状态“filter,filter依赖于它用于过滤的服务。 该服务值可能会在$digest周期中更改,因此必须在筛选器上设置$stateful属性,以便Angular将再次运行筛选器以确保依赖项未更改状态,这将更改筛选器的结果。

所以,所有的“国家”都应该是这样的:

 <p>{{myData | multiplyBy:multiplier}}</p> 

使用如下filter:

 .filter('multiplyBy', function() { function filter(input, multiplier) { return input * multiplier; } return filter; }) 

如果数据或参数改变,filter将再次运行。

stateful版本会是这样的(不推荐!):

 <p>{{myData | myFilter}}</p> 

filter从外部获取所需的信息:

 .filter('myFilter', ['someDependency', function(someDependency) { function filter(input) { // let's just say `someDependency = {multiplier: 3}` return input * someDependency.multiplier; } filter.$stateful = true; return filter; }]) 

在该示例filter中, someDependency.multiplier应该作为parameter passing给filter(如第一个示例中那样),而不是filter的依赖关系。

为了进一步澄清问题:如果你调用这样一个函数: foo(20)并得到40的结果,如果你重复这个过程,你应该得到相同的结果。 如果你再次打电话给foo(20) ,得到了92 ,那会很混乱,对吗? 假设foo不是返回随机值的函数,每次返回不同数字的唯一方法是基于隐藏状态(内部变化,而不是作为参数传入)执行不同的操作。 这个函数每次给出相同的参数都会返回相同的观点被称为“幂等”(idempotent)。

注意: $stateful在Angular 1.3中似乎是新的