по какой-то причине я получаю эту ошибку здесь и не могу понять, почему. У меня инициализирован массив, что является причиной этой ошибки в 99% случаев. Я пытался инициализировать его с помощью private dashboardConversations: ChatDashboard[] = []
и так, как вы видите ниже.
import { DashboardService } from '../../../pages/chatdashboard/_modules/dashboard.service';
export class ProfileComponent implements OnInit {
private dashboardService: DashboardService;
@Input() public contact: Contact;
public constructor(dashboardService: DashboardService) {
this.dashboardService = dashboardService;
}
public ngOnInit(): void {
this.image = this.contact.profilePicture;
this._isAddInfoPresent();
this.dashboardService.createNewConversation(this.contact);
}
}
export class DashboardService {
private dashboardConversations: ChatDashboard[] = new Array<ChatDashboard>();
private bsDashboardConversations$: BehaviorSubject<ChatDashboard[]> = new BehaviorSubject<ChatDashboard[]>(this.dashboardConversations);
public constructor(){}
public activeConversations$(): Observable<ChatDashboard[]> {
return this.bsDashboardConversations$.asObservable();
}
public createNewConversation(user: Contact): void {
const newUser: ChatDashboard = {
id: user.id,
profilePicture: user.profilePicture,
isImportant: false,
lastMessageReceived: null,
hasUnreadMessages: false,
unreadMessages: null,
};
console.info('user before push', newUser); // all appropriate info is there
this.dashboardConversations.push(newUser); //Error here
}
}
public conversations$: ChatDashboard[] = [];
private dashboardService: DashboardService;
public constructor( dashboardService: DashboardService){
this.dashboardService = dashboardService;
}
public ngOnInit(): void {
this.dashboardService.activeConversations$().subscribe((conversations: ChatDashboard[]): void => {
this.conversations$ = conversations;
});
}
ERROR Error: Uncaught (in promise): TypeError: Cannot read property 'push' of null
edit: показано больше кода.
хорошо, я опубликую больше информации. Дело в том, что все примеры, которые я видел ранее, были связаны с объявлением.
@Ctfrancia, куда ты звонишь createNewConversation
? скорее всего это неверный код
@PierreDuc в другом сервисе. Я называю это правильно, потому что информация, которая отправляется в функцию, есть. Я консолью зарегистрировал объект, прежде чем нажимать его, и информация там правильно.
@Ctfrancia, но ... Я спрашиваю, как вы это называете, я довольно уверен в неправильном вопросе, из-за чего вы теряете this
контекст класса обслуживания. Вы можете console.info
объект, который хотите нажать, но this
уже не тот this
. Итак, можете ли вы опубликовать часть, где вы на самом деле вызываете метод createNewConversation
@PierreDuc хорошо ... я покажу больше кода
@Ctfrancia захватывающе! :D
@PierreDuc добавил больше, но я не понимаю, как это сделать. Я делаю буквально то же самое, тот же тип BeaviorSubject с другим компонентом/сервисом и не теряю this
через сервис. Я не могу ни за что, как теряется референция this
. но эй, я ошибся однажды (и только один раз) раньше ?
@PierreDuc Я также жестко запрограммировал объект для отправки, и все та же ошибка.
Можете показать результат console.info(this)
. Поместите его ниже другого console.info, который у вас есть.
и есть ли где-нибудь в вашем сервисе, который вы делаете this.dashboardConversations = null;
?
Давайте продолжить обсуждение в чате.
Вы неправильно привязали свой метод createNewConversation
к любому слушателю, поэтому я предполагаю, что контекст this
потерян
// examples on how to properly do it
.subscribe((user) => this.createNewConversation(user));
.addEventListener((user) => this.createNewConversation(user));
.then((user) => this.createNewConversation(user));
Есть и другие способы, такие как использование .bind(this)
или использование поля класса вместо метода.
Возможно, очистка кода и соблюдение стандартов немного помогут:
export class ProfileComponent implements OnInit {
@Input() public contact?: Contact;
constructor(readonly dashboardService: DashboardService) {}
ngOnInit(): void {
this.image = this.contact.profilePicture;
this._isAddInfoPresent();
this.dashboardService.createNewConversation(this.contact);
}
}
export class DashboardService {
private readonly bsDashboardConversations$: BehaviorSubject<ChatDashboard[]> = new BehaviorSubject<ChatDashboard[]>([]);
readonly activeConversations$ = this.bsDashboardConversations$.asObservable();
constructor(){}
public createNewConversation(user: Contact): void {
const newUser: ChatDashboard = {
id: user.id,
profilePicture: user.profilePicture,
isImportant: false,
lastMessageReceived: null,
hasUnreadMessages: false,
unreadMessages: null,
};
this.bsDashboardConversations$.next([
...this.bsDashboardConversations$.getValue(),
newUser
]);
}
}
readonly conversations$ = this.dashboardService.activeConversations$;
constructor(readonly dashboardService: DashboardService) {}
<div *ngFor = "let conversation of conversations$ | async"></div>
Как он указал, когда я извлекал состояние, второй параметр задавался как null
из TransferState.
Инициализировать bsDashboardConversations$
внутри ngOnInit()
функции
В объявлении значение не будет инициализировано.
откуда вызывается createNewConversation? и, пожалуйста, покажите подписку bsDashboardConversations$. очевидно, что панель DashConversations где-то обнуляется.