У меня есть служба (ClientProfileService), введенная в мой компонент через конструктор, например:
import { ClientProfileService } from '@app/services/client-profile/client-profile.service';
@Component({
selector: 'app-add-transaction',
templateUrl: './add-transaction.component.html',
styleUrls: ['./add-transaction.component.scss']
})
export class AddTransactionComponent implements OnInit, AfterViewInit {
...
...
constructor(
private clientProfileService: ClientProfileService
) { }
...
...
public autoCompleteDisplay(clientId?: string): string | undefined {
if (clientId && clientId.trim() !== '') {
// next line produces the error
let profile: IDetailedClientProfile = this.clientProfileService.findClientProfile(clientId);
if (profile) {
return profile.ClientName;
}
}
return undefined;
}
}
Я использую компонент Angular Material Autocomplete в своем шаблоне, используя атрибут [displayWith], как объяснено в документации Angular Material. Всякий раз, когда я выбираю значение в раскрывающемся списке, выбранное значение (clientId) передается функции autoCompleteDisplay. Эта часть работает нормально, и autoCompleteDisplay вызывается, когда я этого хочу.
ClientProfileService определяется так:
@Injectable({
providedIn:'root'
})
export class ClientProfileService {
private teamClientListSubject: BehaviorSubject<IDetailedClientProfile[]> = new BehaviorSubject(null);
constructor(
private http: HttpClient
) { }
public findClientProfile(clientId: string): IDetailedClientProfile {
let profile: IDetailedClientProfile = this.teamClientListSubject.value.filter(x => x.ClientId === clientId)[0];
return profile;
}
}
Я ссылался на BehaviorSubject в сервисе в нескольких компонентах и даже в других функциях, которые без проблем возвращают наблюдаемые объекты, которые я пропустил в этом случае, чтобы сообщение было более читабельным.
Когда вызывается функция autoCompleteDisplay, я получаю сообщение об ошибке:
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'findClientProfile' of undefined
Итак, ClientProfileService не определен в компоненте в этот конкретный момент, но почему? Я без проблем инициализировал эту службу в нескольких других областях приложения, используя тот же самый метод.