我根据有关管道的Angular.io教程创建了一个简单的有状态管道:
@Pipe({
name: 'fetch',
pure: false
})
class FetchJsonPipe implements PipeTransform{
private fetchedValue = 'waiting';
private fetchedValue2 = 'waiting2';
transform(value:string, args:string[]):any {
setTimeout(() => {
this.fetchedValue = 'done';
this.fetchedValue2 = 'done2';
}, 3000);
return this.fetchedValue2;
}
}
@Component({ selector: 'sd-splash'
, template: 'hello ng2 {{ "5" | fetch }}'
, pipes: [FetchJsonPipe]
})
我的问题是,我回来this.fetchedValue
从#transform
马上。由于它只是一个字符串,因此按value返回。稍后,当超时结束时,我只是将值分配'done'
给一个属性(也是私有的)。
Angular2如何知道初始结果'waiting'
不是最终的?它怎么知道更新的值将通过#fetchedValue
?promise根本没有公开,并且Angular2没有关于我将结果存储在其中的字段名称的信息。
它唯一的线索是pure == false
,我猜它指示它监视实例的更改。但我看不到它如何提供有关要监视的字段的信息。
但这有效!而且我不知道为什么。
干杯
Angular setTimeout()
Monkey使用称为Zone.js的库修补了浏览器事件(包括)。当事件发生时,AngularJS触发更改检测。
对于有状态管道,AngularJS将在每个事件上重新评估管道,因为即使使用相同的输入,管道结果也可能发生变化。
使用纯管道时,AngularJS仅在其中一个输入发生变化(即输入数据或args)时,才会触发变更检测并重新评估管道。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句