如何获取要更新的Angular2 DatePipe格式的日期?

如何获取要更新的Angular2 DatePipe格式的日期?,angular,angular2-pipe,Angular,Angular2 Pipe,问题样本: 从'@angular/core'导入{Component,NgModule} 从“@angular/platform browser”导入{BrowserModule} @组成部分({ 选择器:“我的应用程序”, 模板:` {{myDate}} {{myDate}date:'longDate'} `, }) 导出类应用程序{ myDate:日期; 构造函数(){ this.myDate=新日期(); } 下个月{ this.myDate.setMonth(this.myDate.ge

问题样本:

从'@angular/core'导入{Component,NgModule}
从“@angular/platform browser”导入{BrowserModule}
@组成部分({
选择器:“我的应用程序”,
模板:`
{{myDate}}
{{myDate}date:'longDate'}
`,
})
导出类应用程序{
myDate:日期;
构造函数(){
this.myDate=新日期();
}
下个月{
this.myDate.setMonth(this.myDate.getMonth()+1);
}
上月{
this.myDate.setMonth(this.myDate.getMonth()-1);
}
}
@NGD模块({
导入:[BrowserModule],
声明:[App],
引导:[应用程序]
})
导出类AppModule{}
当我在不使用任何管道的情况下传递变量时,它会按预期更新。但同一变量的DatePipe格式副本不会更新。管道是否仅针对可观察对象进行更新?或者我可以将其与标准日期类型一起使用,并期望其实时更新吗


我在DatePipeAPI中没有看到任何东西表明这是预期的行为,但我已经将其缩小到只有DatePipe可以以这种方式影响bahavior的程度

似乎管道触发器更新不是在链接对象更新之后,而是在对象的链接更新之后

您可以通过重新分配此.myDate来修复它,如下所示:


this.myDate=新日期(this.myDate.setMonth(this.myDate.getMonth()+1))

似乎管道触发器更新不是在链接对象更新之后,而是在对象的链接更新之后

您可以通过重新分配此.myDate来修复它,如下所示:


this.myDate=新日期(this.myDate.setMonth(this.myDate.getMonth()+1))

您需要使用新的日期引用重新分配日期变量

this.myDate=新日期(this.myDate.setMonth(this.myDate.getMonth()+1))

如文件中所述

此管道被标记为纯管道,因此在输入发生变化时不会对其进行重新评估。相反,用户应该将日期视为不可变对象,并在管道需要重新运行时更改引用


您需要使用新的日期引用重新分配日期变量

this.myDate=新日期(this.myDate.setMonth(this.myDate.getMonth()+1))

如文件中所述

此管道被标记为纯管道,因此在输入发生变化时不会对其进行重新评估。相反,用户应该将日期视为不可变对象,并在管道需要重新运行时更改引用


它不工作,因为Angular2是有状态的(装饰函数中的
pure
属性设置为
true
)。有状态管道仅在给定对象上应用一次。您可以更改管道定义(当然不是在A2源中),也可以做一些事情来强制更改数据

因此,解决此问题的第一种方法是创建并使用新的无状态管道:

@Pipe({name: 'myDate', pure: false})
export class MyDatePipe implements PipeTransform {
  transform(value: any, pattern: string = 'mediumDate'): string {
    return (new DatePipe()).transform(value, pattern);
  }
}
我已经准备好了一份工作。 它简单且可重用,因此我建议将此解决方案用于小数据

尽管如此,在每次日期更新后,也可以使用及其
markForCheck()
方法解决此问题-此方法将更有效。
或者,正如Dmitry所说,只要在每次更改数据时创建新的日期对象。

它不起作用,因为Angular2是有状态的(在装饰函数中,
pure
属性设置为
true
)。有状态管道仅在给定对象上应用一次。您可以更改管道定义(当然不是在A2源中),也可以做一些事情来强制更改数据

因此,解决此问题的第一种方法是创建并使用新的无状态管道:

@Pipe({name: 'myDate', pure: false})
export class MyDatePipe implements PipeTransform {
  transform(value: any, pattern: string = 'mediumDate'): string {
    return (new DatePipe()).transform(value, pattern);
  }
}
我已经准备好了一份工作。 它简单且可重用,因此我建议将此解决方案用于小数据

尽管如此,在每次日期更新后,也可以使用及其
markForCheck()
方法解决此问题-此方法将更有效。 或者,正如Dmitry所说,只要在每次需要更改数据时创建新的日期对象