Угловой – редактирование/удаление элемента в массиве объектов

#angular #subject #subject-observer

#угловой #предмет #субъект-наблюдатель

Вопрос:

У меня есть Тема множества пользователей

 private _currentHeroes = new Subjectlt;Hero[]gt;();  currentHeroes = this._currentHeroes.asObservable();  
  • Моя цель состоит в том, чтобы отредактировать только 1 элемент массива без подписки

Функция включения питания пользователя в моем сервисе

 powerUp(id: number) { return this.http  .postlt;Herogt;(environment.apiUrl   'heroes/powerUp/'   id, {})  .pipe(  tap((updatedHero: Hero) =gt; {  this._currentHeroes.next(  // I would like to edit the specific element in the array and than sort them by the power.  );  })  );  }  

Функция удаления пользователя в моем сервисе

 delete(id: number) { return this.http.deletelt;Herogt;(environment.apiUrl   'heroes/'   id).pipe(  tap((deletedHero) =gt; {  this._currentHeroes.next(  // Here I delete the specific element from the array  );  }) );  }  

Если бы Предметом было поведение субъекта, я бы сделал это:

 powerUp(id: number) {  return this.http  .postlt;Herogt;(environment.apiUrl   'heroes/powerUp/'   id, {})  .pipe(  tap((updatedHero: Hero) =gt; {  this._currentHeroes.next(  this._currentHeroes.value  .map((hero: Hero) =gt;  hero.id === updatedHero.id ? updatedHero : hero  )  .sort((a, b) =gt; a.currentPower - b.currentPower)  );  })  );  }   delete(id: number) {  return this.http.deletelt;Herogt;(environment.apiUrl   'heroes/'   id).pipe(  tap((deletedHero) =gt; {  this._currentHeroes.next(  this._currentHeroes.value.filter(  (hero: Hero) =gt; hero.id !== deletedHero.id  )  );  })  );  }  

Но моя цель состоит в том, чтобы достичь того же самого, используя Субъект вместо субъекта поведения.

Я попытался определить ценность предмета, но это невозможно, так как это Предмет. Я попытался поискать в Интернете, но, к сожалению, не нашел никакого полезного решения для своих нужд.

Кто-нибудь сталкивался с этой проблемой? Или как это исправить?

Ответ №1:

Я полагаю, что вы работаете над сервисом, тогда у вас может быть ссылка на массив, который вам нужно изменить в service attr.

 heroes = [];  

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

 powerUp(id: number) { return this.http  .postlt;Herogt;(environment.apiUrl   'heroes/powerUp/'   id, {})  .pipe(  tap((updatedHero: Hero) =gt; {  //modify data reference, to add, update or delete value  // in this case modify with powerup  this.heroes = this.heroes  .map((hero: Hero) =gt;  hero.id === updatedHero.id ? updatedHero : hero  )  .sort((a, b) =gt; a.currentPower - b.currentPower)  // emit the resuelt after every operation   this._currentHeroes.next(  this.herores  );  })  );  }  

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

 // for example to hero with id 2 this.yourHeroService.powerUp(2).subscribe()