【问题标题】:Angular: calling observable getter function from templateAngular:从模板调用可观察的getter函数
【发布时间】:2018-08-06 18:52:21
【问题描述】:

我正在使用Angular 6

我有一个数据类定义 JSON 对象参数并用作可观察对象

contact-list.component.ts

export class ContactListComponent implements OnInit {

  contacts: Contact;

  constructor(
    private contactService: ContactService   
  ) { }

  ngOnInit() {
    this.getContacts();   
  }

  getContacts(): void {
    this.contactService.getContacts().subscribe(
      contacts => {
        this.contacts = contacts;
      }
    );   
  }
}

contact.service.ts

export class ContactService {

  private contactUrl = '/api/contacts/';

  constructor(
    private http: HttpClient,
  ) { }

  getContacts(): Observable<Contact> {
    const url = 'api_url' + this.contactUrl;

    return this.http.get<Contact>(url)
      .pipe(
        catchError(this.handleError('getContacts', null))
      );
  }
}

contact.model.ts

export class Contact {
  count: number;
  next: boolean;
  previous: boolean;
  results: Array<ContactDetails>;
}

class ContactDetails {
  id: string;
  first_name: string;
  last_name: string;
  full_name: string;
  private _gender: string;
  private _avatar: string;

  get gender(): string {
    if (this._gender === 'm') {
      return 'Male';
    } else if (this._gender === 'f') {
      return 'Female';
    } else {
      return '';
    }
  }

  get avatar(): string {
    if (this._avatar === null) {
      console.log('null is');
      return '../assets/img/bg5.jpg';
    } else {
      console.log('avatar');
      return this._avatar;
    }
  }
}

contact.model.ts文件的ContactDetails类中,gender()avatar()有两个函数。

来自服务器的响应有 m 代表 ma​​lef 代表 femaleavatar 没有头像时字段为空。

我想在头像不存在时显示男性女性作为性别头像默认头像。

contact-list.component.html

<div class="col-md-4" *ngFor="let contact of contacts.results">
    <img src={{ contact.avatar }} />
    <h2> {{ contact.full_name }}<h2>
    <h4> {{ contact.gender }}</h4>        
</div>

但是contact.gender 打印的是从服务器返回的值,而不是gender() 函数中指定的值。

如何修改模板中响应数据的内容?

【问题讨论】:

  • 你得到了哪个结果?
  • 就像在gender的情况下,根据getter函数gender(),如果性别是m,它应该返回Male,但它在模板中给出m
  • 您是否尝试过在浏览器中调试该功能是否已执行?
  • 我试过了,那个函数没有调用。

标签: angular angular6


【解决方案1】:

您必须将 json 响应(实际上是一个普通对象,而不是您所期望的 Contact 实例)映射到您的映射类。您可以使用map 来做到这一点,例如。构造函数

  getContacts(): Observable<Contact> {
    const url = 'api_url' + this.contactUrl;

    return this.http.get(url)
      .pipe(
        map(data=>new Contact(data));
        catchError(this.handleError('getContacts', null))
      );
  }

显然你必须添加Contact构造函数实现。

export class Contact {
  count: number;
  next: boolean;
  previous: boolean;
  results: Array<ContactDetails>;

 constructor(data:Object){
   ///do the mapping here
 }
}

只要您使用的是接口而不是实现,类型化的响应就很好。 添加此映射后,它将按预期工作。

【讨论】:

  • 你的意思是//do the mapping here 在构造函数内部,我必须为count = data.count;next = data.next; 等数据成员赋值,并在ContactDetail 类中进一步有一个构造函数像 results = Array(ContactDetails(data.results)) 这样调用,ContactDetail 中有 constructor 来进一步映射数据成员?
  • 是的。那是因为您需要实际的 Contact 对象,而不仅仅是匹配您从通用类型中获得的 Object。如果你只使用接口,你不会注意到区别,但是因为你需要实例方法,所以这是要走的路。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 2018-07-24
  • 1970-01-01
  • 2018-04-11
相关资源
最近更新 更多