Typescript 管道值未更新
“piped”值last不会更新,除非我重新创建管道对象。 这不是我预期的行为,因为我正在以这种方式构建计时器Typescript 管道值未更新,typescript,angular,rxjs,Typescript,Angular,Rxjs,“piped”值last不会更新,除非我重新创建管道对象。 这不是我预期的行为,因为我正在以这种方式构建计时器 @Pipe({ name: 'fromNow' }) export class FromNowPipe { transform(value: any, args: Array<any>): string { return moment(value).fromNow(); } } @Component({ selector: 'event-spi
@Pipe({
name: 'fromNow'
})
export class FromNowPipe {
transform(value: any, args: Array<any>): string {
return moment(value).fromNow();
}
}
@Component({
selector: 'event-spinner',
changeDetection: ChangeDetectionStrategy.Default, // all other modes does not work at all
pipes: [FromNowPipe],
template: `
<div class="col-xs-5">
NOT updating: {{ last | fromNow }} <br/>
Updating: {{ lastText }} <br/>
</div>
`
})
export class EventSpinner implements OnInit {
last: moment.Moment;
lastText: string;
ngOnInit(): void {
this.last = moment();
let obs = Observable.interval(1000).subscribe(() => {
// this.last = moment(this.last); // uncommenting this line it updates
this.lastText = this.last.fromNow();
this.cdRef.detectChanges(); // commenting this line breaks everything
});
}
}
@管道({
姓名:“从现在起”
})
从NowPipe导出类{
转换(值:任意,参数:数组):字符串{
返回力矩(值).fromNow();
}
}
@组成部分({
选择器:“事件微调器”,
changeDetection:ChangeDetectionStrategy.Default,//所有其他模式都不工作
管道:[来自NowPipe],
模板:`
不更新:{last | fromNow}}
更新:{{lastText}}
`
})
导出类EventSpinner实现OnInit{
最后:时刻,时刻;
lastText:字符串;
ngOnInit():void{
这是最后一刻;
让obs=Observable.interval(1000).subscribe(()=>{
//this.last=时刻(this.last);//取消对更新的此行的注释
this.lastText=this.last.fromNow();
this.cdRef.detectChanges();//注释这行会破坏一切
});
}
}
我能做些什么以干净的方式解决这个问题?
i、 e.避免添加额外的对象,如lastText或每次从自身复制矩对象
提前谢谢 我认为这是因为时刻不在Angular2的范围内,所以你需要在一个区域内执行事情:
constructor(private ngZone:NgZone) { // <-----
}
ngOnInit(): void {
this.ngZone.run(() => { // <-----
this.last = moment();
let obs = Observable.interval(1000).subscribe(() => {
// this.last = moment(this.last); // uncommenting this line it updates
this.lastText = this.last.fromNow();
this.cdRef.detectChanges(); // commenting this line breaks everything
});
});
}
构造函数(私有ngZone:ngZone){/{/{
//this.last=时刻(this.last);//取消对更新的此行的注释
this.lastText=this.last.fromNow();
this.cdRef.detectChanges();//注释这行会破坏一切
});
});
}
编辑
实际上,fromNow
方法更新this.last
属性的内容,而不是它的引用。Angular2根据参考变化检测变化。你用实际做什么他第一次打开了DHC