У меня есть служба (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 в своем шаблоне, используя атрибут [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 не определен в компоненте в этот конкретный момент, но почему? Я инициализировал эту службу в нескольких других областях приложения, используя тот же метод, без каких-либо проблем.
Нет - я использую обходной путь в настоящее время, пока у меня не будет времени вернуться и посмотреть на него еще раз.
Думаю, это может вам помочь: Компонент Angular2 "this" не определен.





Я думаю, что ваш импорт неправильный, он должен быть
import { ClientProfileService } from './services/client-profile/client-profile.service';
Думаю, это кажется разумным. @app - это псевдоним webpack, верно? Тогда я бы предположил, что игра с параметрами узла webpacks для __dirname / __filename также может иметь значение. webpack.js.org/configuration/node
Спасибо за ответ, но путь импорта правильный. Путь - это псевдоним, заданный в tsconfig.json. Есть другие идеи?
попробуйте зарегистрировать сервис в AppModule
Убедитесь, что ваш сервис добавлен к поставщикам в app.module.ts:
import { ClientProfileService } from '@app/services/client-profile/client-profile.service';
...
@NgModule({
declarations: [ ... ],
imports: [ ... ],
providers: [ ..., ClientProfileService],
bootstrap: [AppComponent]
}) export class AppModule { }
Нужный вам ответ можно найти здесь: Невозможно прочитать свойство - displayWith. Проблема в том, как вы использовали displayWith, а не во внедрении в файлы .ts.
просто любопытно, ты когда-нибудь догадалась об этом?