Typescript 管道值未更新

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

“piped”值last不会更新,除非我重新创建管道对象。 这不是我预期的行为,因为我正在以这种方式构建计时器

@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