7

我只是做了一个简单的视图,我可以更改一个月:

    <button class="btn btn-primary" (click)="switchToPrevMonth()"><</button>
{{currentDate|date:'MMMM'}}
<button class="btn btn-primary" (click)="switchToNextMonth()">></button>

然后在我的 .ts 中:

ngOnInit() {
this.currentDate = new Date();
}

switchToNextMonth() {
 this.currentDate.setMonth(this.currentDate.getMonth()+1)
 this.cdRef.detectChanges()
}

switchToPrevMonth() {
this.currentDate.setMonth(this.currentDate.getMonth()-1)
this.cdRef.detectChanges()
}

但它不会刷新日期 - 我通过创建一个在 ts 中使用 DatePipe 的方法 getDate() 使其工作(请看下面的代码)并返回一个字符串,但想知道为什么第一种情况不起作用以及是否存在是一种让它工作的方法......?:s

有效的代码:

    <button class="btn btn-primary" (click)="switchToPrevMonth()"><</button>
{{getDate()}}
<button class="btn btn-primary" (click)="switchToNextMonth()">></button>

.ts:

getDate():string{
return this.dp.transform(this.currentDate,"MMMM");
}
4

1 回答 1

13

当 Date 对象被修改时,Angular 不会检测到任何变化。强制更改检测的一种方法是在每次修改日期时创建一个新的 Date 对象。您可以在此 stackblitz中看到它无需ChangeDetectorRef.detectChanges手动调用即可工作(除非您的组件使用ChangeDetectionStrategy.OnPush.

export class MyComponent implements OnInit {

  public currentDate: Date;

  ngOnInit() {
    this.currentDate = new Date();
  }

  switchToNextMonth() {
    this.incrementMonth(1);
  }

  switchToPrevMonth() {
    this.incrementMonth(-1);
  }

  private incrementMonth(delta: number): void {
    this.currentDate = new Date(
      this.currentDate.getFullYear(),
      this.currentDate.getMonth() + delta,
      this.currentDate.getDate());
  }
}
于 2018-01-24T22:35:25.783 回答