Как обновить тему поведения после запроса патча?

Как обновить представление новыми значениями после выполнения запроса на исправление?

Я создал фиктивное приложение на stackblitz. https://stackblitz.com/edit/angular-j35vrb

При нажатии любой строки в таблице открывается модальное окно и обновляется статус TODO. Если статус неполный = false, отправляется запрос на исправление и статус обновляется на true (видно в логе консоли).

Как сообщить объекту поведения (через который извлекаются данные) о том, что в содержимом есть какое-то обновление? чтобы в таблице, а также в верхнем разделе (количество полных/незавершенных дел) отображались обновленные значения

stackoverflow.com/a/38184774/6294072 Это должно вам помочь.
AT82 23.04.2019 20:36
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 063
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обновил ваш 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

prawwe316 24.04.2019 19:11

вот вилка с добавлением пагинации stackblitz.com/edit/angular-boenjx

prawwe316 24.04.2019 19:19

исправил проблему в вашем stackblitz. Посмотри. Только что обновил обработчик подписки в child2.component.ts

Samarpan 25.04.2019 10:44

я не могу найти изменение. Можете ли вы помочь мне? Спасибо

prawwe316 25.04.2019 12:24

В child2.component.ts замените - this.todos$.subscribe( (data)=>{ this.page = this.page || 1; this.pageSize = 10; } ) - stackblitz.com/edit/angular-boenjx

Samarpan 25.04.2019 14:16

проблема все еще существует. если вы открываете любую задачу со страницы> 1, после модального открытия она сбрасывается на страницу 1

prawwe316 25.04.2019 18:57

что я, вероятно, мог бы сделать, так это если я получу успех в запросе на исправление, тогда мне придется переназначить this.page на то, что было до отправки запроса

prawwe316 25.04.2019 19:01

Вы использовали исправление, которым я поделился. Вам нужно обновить оператор, который в настоящее время - this.page = 1; Измените это на - this.page = this.page || 1; Это исправление вашей проблемы. Я сделал это изменение, но кажется, что оно отменяется, когда вы делитесь им с вами. Позвольте мне также обновить свой ответ.

Samarpan 26.04.2019 08:06

это сработало!! Я создал тему поведения ... и пусть currentPage = this.page после получения ответа на исправление как успешное, я установил this.page = currentPage Решение, которое вы дали, намного проще. Спасибо!! @samy-б

prawwe316 27.04.2019 11:25

Другие вопросы по теме