5.5 有状态管道 - RLwu/angular-start GitHub Wiki
有状态管道
我们之前了解的管道,包括Angular2预置的管道,以及我们自己实现的管道,都有一个特点, 就是输出仅仅依赖于输入,这样的管道,在Angular2中被称为无状态管道/Stateless Pipe。
对于无状态管道,当输入没有变化时,Angular2框架不会重新计算管道的输出。但也许有些时候, 我们希望即使输入没有变化,也持续地检测管道的输出。例如,我们设计了一个倒计时管道,向 它输入一个秒数,会自动多次输出直至0秒:
{{ 10 | countdown }}
实现countdown的逻辑很简单,记录起始值,然后开一个1秒1次的计时器,逐次减至0秒即可。
关键在于,默认情况下,Angular2框架仅仅执行一次管道的transform()方法,我们需要 使用Pipe注解的pure属性值为false,要求Angular2框架在每个变化检查周期都执行 管道的transform()方法:
@pipe({
name:"countdown",
pure : false
})
class EzCountdown{...}
很显然,countdown管道的输出不仅依赖于输入,还依赖于其内部的运行状态。因此,这样 的管道,在Angular2中被称为有状态管道/Stateful Pipe。
注意
需要指出的是,管道的有状态与无状态的区别,关键在于是否需要Angular2框架在输入不变的 情况下依然持续地进行变化检测,而不在于我们通常所指的计算的幂等性 - 即同样的输入 总是产生同样的输出。
例如,一个计算累加值的管道,在传统的概念中,应当被视为有状态的,因为它对于同样的输 入,会累加之前记录的总和,因此会产生不同的输出。但是,在Angular2中,它依然被视为无 状态的,因为,它的一次输入不会产生多次输出。