Javascript AngularJS中的状态过滤是什么?

Javascript AngularJS中的状态过滤是什么?,javascript,angularjs,filter,Javascript,Angularjs,Filter,我在阅读过滤器部分()的AngularJS开发者指南时遇到了“有状态过滤器” 该说明如下所示: 强烈建议不要编写有状态的过滤器,因为这些过滤器的执行不能通过Angular优化,这通常会导致性能问题。许多有状态过滤器可以转换为无状态过滤器,只需将隐藏状态作为模型公开,并将其转换为过滤器的参数即可 我是web开发新手,所以不知道有状态过滤是什么,Angular文档也没有解释:(有人能解释一下普通过滤器和有状态过滤器的区别吗?“状态”是指在整个应用程序中设置的变量/属性/等。这些值在任何给定时间都有可

我在阅读过滤器部分()的AngularJS开发者指南时遇到了“有状态过滤器”

该说明如下所示:

强烈建议不要编写有状态的过滤器,因为这些过滤器的执行不能通过Angular优化,这通常会导致性能问题。许多有状态过滤器可以转换为无状态过滤器,只需将隐藏状态作为模型公开,并将其转换为过滤器的参数即可

我是web开发新手,所以不知道有状态过滤是什么,Angular文档也没有解释:(有人能解释一下普通过滤器和有状态过滤器的区别吗?

“状态”是指在整个应用程序中设置的变量/属性/等。这些值在任何给定时间都有可能发生更改。文档中说过滤器不应依赖于外部“状态”。筛选器需要知道的任何信息都应在筛选时作为参数传入,然后筛选器应拥有进行筛选所需的所有信息并返回结果。查看文档中的演示,您将在“有状态”中看到过滤器,过滤器依赖于它用来进行过滤的服务。该服务值可能在
$digest
周期内发生变化,因此必须在过滤器上设置
$stateful
属性,以便Angular将再次运行过滤器,以确保依赖关系没有改变状态,从而改变过滤器的结果。

因此,所有“状态”都应该在参数中,如下所示:

<p>{{myData | multiplyBy:multiplier}}</p>
如果数据或参数更改,筛选器将再次运行

stateful
版本如下(不推荐!):

在该示例过滤器中,
someDependency.multiplier
应该作为参数传递给过滤器(如第一个示例中所示),而不是作为过滤器的依赖项

为了进一步澄清这个问题:如果您调用这样的函数:
foo(20)
并得到
40
的结果,那么如果您重复该过程,应该会得到相同的结果。如果您调用
foo(20)
又一次得到了
92
,这会让人很困惑,对吧?假设
foo
不是一个用来返回随机值的函数,那么它每次返回不同数字的唯一方法就是根据隐藏状态执行不同的操作(某些内部更改,而不是作为参数传入)。每次给定相同的参数时,函数都会返回相同的值,这种想法称为“幂等函数”


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

我在官方文档中没有找到这个链接。@guymograbi链接就在问题的顶部。是的-谢谢,我的意思是在迁移指南中。他们什么也没说。@m59@jusopi这有点像。。不确定你的措辞。Angular正在尝试o避免无缘无故地多次运行筛选器。如果筛选器是幂等的,Angular可以查看正在筛选的值和传递给筛选器的参数,如果它们都相同,则无需再次运行筛选器。对于内部状态,Angular不知道内部是否发生了更改,因此它必须运行每一个消化周期都要再次过滤,以产生可能与之前相同的结果。我想这就是你所说的要点。
.filter('multiplyBy', function() {
  function filter(input, multiplier) {
    return input * multiplier;
  }
  return filter;
})
<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;
}])