NgOnChanges не запускается после HTTP-запроса
У меня проблема с ngonchanges не стрельба.
У меня есть этот компонент:
@Component({
selector: 'conversation-detail',
templateUrl: './conversation-detail.component.html'
})
export class ConversationDetailComponent implements OnChanges{
@Input()
selectedConversation: Conversation;
title = 'Conversation Detail';
convoMessages: Array<Message> = [];
constructor(
private _messageService: MessageService
){};
ngOnChanges(changes: SimpleChanges){
this.getMessages();
}
ngOnInit(): void{
}
private getMessages(){
if(this.selectedConversation != undefined){
this._messageService.getMessagesForConversation(this.selectedConversation.ConversationId).then(
data => {
if (data) {
this.convoMessages = data.serviceResult as Array<Message>;
} else {
//This really should never happen
console.error('Error retrieving users data: Data object is empty');
}
},
error => {
//loader.dismiss();
console.error('Error retrieving users data');
console.dir(error);
}
);
}
}
}
Ngonchanges сработает при первом изменении selectedConversation. Вызывается GetMessages, и он загружает данные сообщения. После этого ngonchanges больше не срабатывает при изменении selectedConversation.
Если я закомментирую вызов функции getMessages, то ngonchanges будет срабатывать каждый раз, когда selectedConversation изменяется.
Итак, я не уверен, что происходит в getMessages, который отключает ngonchanges от запуска. Запрос возвращает данные и звонок завершается. У кого-нибудь есть идеи?
2 ответа
Пожалуйста, измените ваш компонент как:
@Component({
selector: 'conversation-detail',
templateUrl: './conversation-detail.component.html',
changeDetection: ChangeDetectionStrategy.Default
})
Это прекрасно работает для меня.
ngOnChanges срабатывает только если @Input
менять reference
Например, тип ввода string
, boolean
, number
неизменный объект.
предполагать [selectedConversation]
привязать к массиву arrSelected
, если вы делаете что-то вроде arrSelected.push
Массив не меняется ref
так что ngOnChanges не сработает.
так что вам нужно использовать неизменяемый массив, используя concat
, slice
и т.д., чтобы изменить ссылку на массив