#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()