http://plnkr.co/edit/TNdkfmoCc9JA1G7cEk26?p=preview

我创建了一个类Item,它具有自定义的get date(): Dateset 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 }} &mdash; {{ 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将是您的设置者

10-04 16:15
查看更多