Как обновить представление новыми значениями после выполнения запроса на исправление?
Я создал фиктивное приложение на stackblitz. https://stackblitz.com/edit/angular-j35vrb
При нажатии любой строки в таблице открывается модальное окно и обновляется статус TODO. Если статус неполный = false, отправляется запрос на исправление и статус обновляется на true (видно в логе консоли).
Как сообщить объекту поведения (через который извлекаются данные) о том, что в содержимом есть какое-то обновление? чтобы в таблице, а также в верхнем разделе (количество полных/незавершенных дел) отображались обновленные значения



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я обновил ваш stackblitz решением. Вот что вам нужно сделать.
В main.service.ts,
Сохраните ссылку на todos в самом сервисе для будущих обновлений. Смотри ниже.
private allTodos: Todo[];
getTodo() {
if (!this.allTodos$){
this.allTodos$ = <BehaviorSubject<Todo[]>>new BehaviorSubject(new Array<Todo>());
this.http
.get<Todo[]>(
'https://jsonplaceholder.typicode.com/todos'
).subscribe(
(data: Todo[]) => {
this.allTodos = data;
this.allTodos$.next(data);
}
),
error => console.info(error);
}
}
Возвратите BehaviourSubject непосредственно из метода subscribetoTodos. Темы могут быть подписаны напрямую.
subscribetoTodos(): Observable<Todo[]>{
return this.allTodos$;
}
обновите метод updateToDo, как показано ниже. Обратите внимание, как я обновляю здесь одну ссылку на Todo в списке и отправляю ее подписчикам через next.
updateTodo(id){
this.http.patch('https://jsonplaceholder.typicode.com/todos/' + id , { 'completed': true })
.subscribe(
data => {
this.allTodos.find(todo => {
if (todo.id === id) {
Object.assign(todo, data);
return true;
}
return false;
});
console.info(data);
this.allTodos$.next(Object.assign([], this.allTodos));
},
error => console.info(error)
)
}
Это обновит ваш взгляд.
В случае разбитых на страницы данных измените подписку на указанную ниже.
ngOnInit() {
this.todos$ = this.mainService.subscribetoTodos();
this.todos$.subscribe(
(data)=>{
this.page = this.page || 1;
this.pageSize = 10;
}
)
}
Обратите внимание, как я проверяю, существует ли this.page, а затем использую его, иначе перейдите на страницу 1.
this.page = this.page || 1;
Раньше было,
this.page = 1;
который сбрасывал страницу обратно на 1 всякий раз, когда происходило какое-либо обновление.
это работает. Но, кажется, есть некоторая проблема. Если есть нумерация страниц и предположим, что я нахожусь на 3-й странице, список перескакивает на первую страницу после обновления. Что может быть причиной этой проблемы? angular-boenjx.stackblitz.io
вот вилка с добавлением пагинации stackblitz.com/edit/angular-boenjx
исправил проблему в вашем stackblitz. Посмотри. Только что обновил обработчик подписки в child2.component.ts
я не могу найти изменение. Можете ли вы помочь мне? Спасибо
В child2.component.ts замените - this.todos$.subscribe( (data)=>{ this.page = this.page || 1; this.pageSize = 10; } ) - stackblitz.com/edit/angular-boenjx
проблема все еще существует. если вы открываете любую задачу со страницы> 1, после модального открытия она сбрасывается на страницу 1
что я, вероятно, мог бы сделать, так это если я получу успех в запросе на исправление, тогда мне придется переназначить this.page на то, что было до отправки запроса
Вы использовали исправление, которым я поделился. Вам нужно обновить оператор, который в настоящее время - this.page = 1; Измените это на - this.page = this.page || 1; Это исправление вашей проблемы. Я сделал это изменение, но кажется, что оно отменяется, когда вы делитесь им с вами. Позвольте мне также обновить свой ответ.
это сработало!! Я создал тему поведения ... и пусть currentPage = this.page после получения ответа на исправление как успешное, я установил this.page = currentPage Решение, которое вы дали, намного проще. Спасибо!! @samy-б