Угловая 10 Перезагрузка После Удаления

#html #angular #typescript

Вопрос:

Я пытаюсь найти наилучший подход к обновлению после удаления элемента с моего сервера json. Он успешно удаляет элемент, но мне нужно обновить страницу, чтобы увидеть, что элемент удален. Я попытался выполнить перезагрузку из html, когда нажимается кнопка удаления, но безуспешно. Я знаю, что хочу снова загрузить элемент, чтобы он показал, что элемент больше не существует.

Я снова попытался позвонить в «get», но получил много ошибок, пытаясь использовать подписку, и, судя по моим исследованиям, использование подписки внутри подписки не является хорошим подходом. Я не хочу на самом деле перезагружать страницу, просто реалистичный способ вызвать мою функцию get, которая на самом деле отвечает за отображение элементов в моем представлении.

Вот мое удаление внутри моего сервиса.

 RemoveProductFromWishlistItem(id:number): Observable<void>{
         console.log("Remove from wishlist item");
           return this.http.delete<void>(`${this.wishlistitemUrl}/${id}`)
     
           .pipe(catchError(_err => of (null))
         );
     
}
 

Заранее Благодарю Вас За
PH

Комментарии:

1. Как вы обновляете локальную область? На самом деле вам не нужно делать еще один заказ. Просто обновите локальные данные.

2. используйте switchMap, чтобы получить обновленный список пожеланий после удаления: learnrxjs.io/learn-rxjs/operators/transformation/switchmap

Ответ №1:

Вот как бы я это сделал

1-й подход: Наблюдаемые объекты и подписки

Когда контент загружается сначала, и вы подписываетесь на .get (), вы можете сохранить подписку и отказаться от нее, когда захотите обновить страницу.

 // items-list.component.ts

private subscription: Subscription;

ngOnInit(){
    this.loadPosts();
}

loadPosts(){
    this.subscription = this.service.getItems().subscribe(items=>{
        this.items = items;
    });
}

// called by a button click
onDelete(id){
    this.service.deleteItemById(id).subscribe(()=>{
        if(this.subscription) this.subscription.unsubscribe();
        this.loadPosts(); // reload all posts from the server
    });
}
 

2-й Подход: Обещания

 ngOnInit(){
    this.loadPosts();
}

async loadPosts(){
  try{
      this.posts = await this.service.getPosts().toPromise()
  } catch(e){ 
      console.error(e); 
  }
}

onDelete(id){
   this.service.deleteById(id).subscribe(()=>{
       this.loadPosts();
   })
}
 

3-й подход: обновление изменений локально

Вы можете просто удалить удаленный элемент из локального списка, тем самым избавив себя от большого количества ненужного использования сети. Но имейте в виду случай, когда кто — то другой тем временем изменил список. Существует два метода

  • Сначала обновите содержимое, а затем сделайте запрос на удаление, предполагая, что он будет выполнен успешно. Это может ускорить реакцию вашего приложения, но может привести к тому, что пользователь увидит, что элемент удален, хотя он и не удален с сервера.
  • Удалите содержимое с сервера и обновите представление, когда оно завершится.
 onDelete(id){
    let deletedElement, deletedIndex;

    items.forEach((element, index) => {
        if(element.id == id) {
            this.items.splice(index, 1);
            deletedelement = element;
            deletedIndex = index;
        }
    });

    this.service.deleteItem(id).catch(e=>{
        // restore deleted element
        this.items.splice(deletedIndex, 0, deletedItem); 
    });
}
 

Ответ №2:

Как упоминалось в комментарии, добавьте карту-переключатель, чтобы повторно зафиксировать данные после удаления, так что что-то вроде этого:

 RemoveProductFromWishlistItem(id:number): Observable<WishlistModelHere>{
  return this.http.delete<void>(`${this.wishlistitemUrl}/${id}`).pipe(
    switchMap(() => this.getWishlist()),
    catchError(_err => of (null))
  );
}
 

Я использовал здесь фиктивные имена, так как мы не знаем, как называется ваша модель (назвали ее WishlistModelHere ), и получил список желаний, который я назвал getWishlist .

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