http://plnkr.co/edit/TNdkfmoCc9JA1G7cEk26?p=preview
我创建了一个类Item
,它具有自定义的get date(): Date
和set date(date: Date)
方法:
export class Item {
id: number;
name: string;
_date: Date;
get date(): Date {
return this._date;
}
set date(date: Date) {
this._date = date;
this.name = (this.name + ' (updated)');
}
}
在我的应用程序组件中,我尝试了三件事来调用我的自定义设置器。我以为它们都可以,但是只有一个可以,而且我想获得一些帮助以了解原因!
将与
Item
类定义匹配的对象数组传递给键入为Item[]
的字段。我在
date
属性中的一个对象(Item
)上手动设置了items
。日期已设置,但不是通过我的设置器。 (由name
属性表示保持不变。)我实例化了自己的
Item
,设置了date
,然后将其推送到items
。此方法有效!我尝试通过将属性移到构造函数来进行更具体的描述,猜测当我为对象的类型字段提供类型化字段时,可能将对象的内容传递到了那里。 (I made a fork of my plunker with this attempt.)
为什么用该方法创建带有类的对象数组时,我的setter为什么不被调用?
import {Component, OnInit} from '@angular/core'
import {Item} from './item'
@Component({
selector: 'my-app',
providers: [],
template: `
<div>
<h2>{{name}}</h2>
<div *ngFor="let item of items">
{{ item.name }} — {{ item.date | date:"d/M/y h:mm a" }}
</div>
</div>
`,
directives: []
})
export class App implements OnInit {
items: Item[];
constructor() {
this.name = 'Understanding Getters/Setters in Typescript'
}
ngOnInit() {
this.items = [{
id: 1,
name: 'Item 1',
date: new Date()
}, {
id: 2,
name: 'Item 2',
date: new Date(2016, 0, 2, 21)
}];
// Doesn't trigger the setter
this.items[1].date = new Date(1985, 0);
let testItem = new Item();
testItem.name = 'Item 3';
// Triggers the setter
testItem.date = new Date(2001, 0, 1, 6);
this.items.push(testItem);
}
}
最佳答案
这是一个数组/对象文字:
[{
id: 1,
name: 'Item 1',
date: new Date()
}, {
id: 2,
name: 'Item 2',
date: new Date(2016, 0, 2, 21)
}];
它将覆盖声明中使用
Item[]
初始化的items
数组。这些数组元素中的每一个都只是一个普通对象,而不是您的Item
类的实例。为此,您需要使用new Item()
:this.items = [ new Item(), new Item() ];
this.items[1].date = new Date(1985, 0);
至于:
let testItem = new Item();
testItem.name = 'Item 3';
// Triggers the setter
testItem.date = new Date(2001, 0, 1, 6);
之所以有效,是因为您正在创建类的新实例。因此
testItem.date
将是您的设置者