一尘不染

AngularJS中的状态过滤是什么?

angularjs

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

该描述如下:

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

我是Web开发的新手,所以不知道什么是有状态过滤,而Angular
Documentation也没有解释:(有人可以解释一下普通过滤器和有状态过滤器之间的区别是什么吗?


阅读 213

收藏
2020-07-04

共1个答案

一尘不染

“状态”是指在整个应用程序中设置的变量/属性/等。这些值有可能在任何给定时间改变。文档说过滤器不应该依赖于外部“状态”。过滤器需要了解的所有内容都应在过滤时作为参数传递,然后过滤器应具有进行过滤并返回结果所需的一切。查看文档中的演示,您将在“状态过滤器”,该过滤器依赖于用于进行过滤的服务。该服务值可能会在一个$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中似乎是新的

2020-07-04