Не удается вызвать метод класса модели из Component.html в angular2

Я новичок в angular js 2. В настоящее время

Я определил компонент для отображения членов списка. Из шаблона HTML я хочу вызвать метод getAvatar() члена. Но я получил следующую ошибку:

[Ошибка] ОШИБКА — TypeError: _v.context.$implicit.getAvatar не является функцией. (В '_v.context.$implicit.getAvatar()' '_v.context.$implicit.getAvatar' не определено) TypeError: _v.context.$implicit.getAvatar не является функцией. (В '_v.context.$implicit.getAvatar()', '_v.context.$implicit.getAvatar' не определено) error View_MyChatsListComponent_2 (MyChatsListComponent.ngfactory.js:20) logError (vendor.bundle.js:79083) ( анонимная функция) handleError (vendor.bundle.js:66715) tick (vendor.bundle.js:70507) (анонимная функция) (vendor.bundle.js:70378:111) onInvoke (vendor.bundle.js:69568) run ( polyfills.bundle.js:2556) следующий (vendor.bundle.js:70378:86) (анонимная функция) (vendor.bundle.js:69270) __tryOrUnsub (vendor.bundle.js:23417) следующий (vendor.bundle.js :23364) _next (vendor.bundle.js:23304) next (vendor.bundle.js:23268) next (vendor.bundle.js:23012) emit (vendor.bundle.js:69256) checkStable (vendor.bundle.js :69533) onLeave (vendor.bundle.js:69609) onInvokeTask (vendor.bundle.js:69562) runTask (polyfills.bundle.js:2606) invoke (polyfills.bundle.js:2901) (анонимная функция) (polyfills. пакет.js:4669)

Класс модели:

import { GlobalConst } from './global';

export class Member {
  id: number;

  getAvatar(): string {
    return GlobalConst.BASE_API_URL + "/users/" + this.id + "/avatar?w=60&h=60";
  }
}

Компонент

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

import { Member } from './member';
import { MemberService } from './member.service';
import { GlobalConst, GlobalVar } from './global';

@Component({
    selector: 'my-members-list',
    templateUrl: './my-members-list.component.html',
  styleUrls: [ './my-members-list.component.css' ]
})

export class MyMembersListComponent implements OnInit {

  title = 'Chat API';
  members: Member[];

  constructor(
    private memberService: MemberService,
    private router: Router
  ){};

  ngOnInit(): void {
    this.memberService.getMembers()
        .then( members => {
            this.members = members;
        });
  }

  getAvatar(member: Member): string {
    return GlobalConst.BASE_API_URL + "/users/" + member.id + "/avatar?w=60&h=60";
  }
}

Сервис для участников

import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';


import 'rxjs/add/operator/toPromise';

import { Member } from './member';
import { GlobalConst, GlobalVar } from './global';


@Injectable()

    export class ChannelService {

        private memberUrl: string = "<it is a private url>"

        constructor(private http: Http, localStorage: LocalStorageService) {};  

        getMembers(): Promise<Member[]> {
            return this.http.get( this.memberUrl, {headers: GlobalVar.httpHeader})
                   .toPromise()
                   .then( response => {
                    return response.json() as Member[];
                   })
                   .catch( this.errorHandler );
    }
}

Шаблон:

<li class="mix active" style="display: block;" *ngFor="let member of members">
  <div class="media">

    <div class="media-left">
        <span>
          <img src="{{member.getAvatar()}}" class="avatar">
        </span>
        <span class="status offline"></span>
    </div>

  </div>
</li>

Если написать метод getAvatar() в компоненте и передать элемент в качестве параметра, то он работает гладко. Но в последнем случае я должен написать это getAvatar() во всех компонентах, где я хочу отображать изображение члена.

Пожалуйста, предложите, если у вас есть другое решение для повторного использования.


person Milan Kamilya    schedule 12.07.2017    source источник
comment
Можете ли вы показать, как ваш компонент получает доступ к members?   -  person Frank Modica    schedule 12.07.2017
comment
@FrankModica, конечно, позвольте мне обновить вопрос   -  person Milan Kamilya    schedule 12.07.2017
comment
У вас также есть синтаксическая ошибка. this..id должно быть this.id   -  person Frank Modica    schedule 12.07.2017
comment
Спасибо, да, я исправил это.   -  person Milan Kamilya    schedule 12.07.2017
comment
Кажется, ваша переменная members - это просто массив объектов, а не массив классов Member   -  person yurzui    schedule 12.07.2017
comment
@yurzui тогда, какой будет правильный синтаксис.   -  person Milan Kamilya    schedule 12.07.2017
comment
Вы должны показать свою реализацию метода memberService.getMembers()   -  person Poul Kruijt    schedule 12.07.2017
comment
@PierreDuc Я собираюсь обновить.   -  person Milan Kamilya    schedule 12.07.2017
comment
@yurzui спасибо, попробую.   -  person Milan Kamilya    schedule 12.07.2017
comment
Спасибо, @yurzui, сработало.   -  person Milan Kamilya    schedule 12.07.2017


Ответы (2)


return response.json() as Member[] не создает массив членов волшебным образом. как сказал yurzui в своем комментарии, вам нужно инициировать экземпляры Member, изменить свой метод на:

this.http.get( this.memberUrl, {headers: GlobalVar.httpHeader})
         .map(response => response.json)
         .map(x => Object.assign(new Member(), x))
         .toPromise()
         .catch(this.errorHandler);

Приведение в TypeScript просто намекает компилятору, на самом деле оно ничего не делает в скомпилированном JavaScript.

person Poul Kruijt    schedule 12.07.2017
comment
Спасибо, @PierreDuc. - person Milan Kamilya; 12.07.2017

Создайте один сервис, который предоставит вам метод getAvatar(). Внедряйте эту службу везде, где вы хотите получить доступ к методу getAvatar(). Передайте идентификатор этому методу. как вы сделали, что вы объяснили в более поздней части вопроса. Переместите этот метод только в службу, чтобы он был доступен для всех компонентов.

person Prathmesh Dali    schedule 12.07.2017