Angular – editar/eliminar elemento en un Array de Asuntos
Tengo un tema de Array de Usuarios
private _currentHeroes = new Subject<hero[]>();
currentHeroes = this._currentHeroes.asObservable();
Mi objetivo es editar solo 1 elemento del array sin suscribirme.
Función para potenciar al usuario en mi servicio
powerUp(id: number) {
return this.http
.post<hero>(environment.apiUrl + 'heroes/powerUp/' + id, {})
.pipe(
tap((updatedHero: Hero) => {
this._currentHeroes.next(
// Me gustaría editar el elemento específico en el array y luego ordenarlos por potencia.
);
})
);
}
Función para eliminar al usuario en mi servicio
delete(id: number) {
return this.http.delete<hero>(environment.apiUrl + 'heroes/' + id).pipe(
tap((deletedHero) => {
this._currentHeroes.next(
// Aquí elimino el elemento específico del array
);
})
);
}
Si el Subject fuera BehaviorSubject, haría lo siguiente:
powerUp(id: number) {
return this.http
.post<hero>(environment.apiUrl + 'heroes/powerUp/' + id, {})
.pipe(
tap((updatedHero: Hero) => {
this._currentHeroes.next(
this._currentHeroes.value
.map((hero: Hero) =>
hero.id === updatedHero.id ? updatedHero : hero
)
.sort((a, b) => a.currentPower - b.currentPower)
);
})
);
}
delete(id: number) {
return this.http.delete<hero>(environment.apiUrl + 'heroes/' + id).pipe(
tap((deletedHero) => {
this._currentHeroes.next(
this._currentHeroes.value.filter(
(hero: Hero) => hero.id !== deletedHero.id
)
);
})
);
}
Pero mi objetivo es lograr lo mismo utilizando un Subject en lugar de BehaviorSubject.
Intenté obtener el valor del subject pero no es posible porque es un Subject. Busqué en línea pero desafortunadamente no encontré ninguna solución útil para mis necesidades.
¿Alguien ha encontrado este problema? ¿O cómo solucionarlo?</hero[]>
davy.ai
Según la funcionalidad de un Subject, no almacena el valor actual y solo envía nuevos valores a sus suscriptores. Por lo tanto, para editar solo 1 elemento del array sin suscribirse, podemos utilizar el operador RxJS
take(1)
para obtener el valor actual y realizar las modificaciones requeridas en él.A continuación se presentan las funciones actualizadas:
Función para potenciar al usuario en mi servicio
Función para eliminar al usuario en mi servicio
Aquí, primero usamos el operador
take(1)
dentro del métodopipe
para obtener el valor actual del Subject solo una vez. En la funciónpowerUp
, primero encontramos el índice del héroe que se va a actualizar utilizando el métodofindIndex
y luego realizamos la modificación requerida. Luego, pasamos el array modificado al métodonext
del Subject después de ordenarlo por poder.De manera similar, en la función
delete
, filtramos al héroe eliminado del array y pasamos el array filtrado al métodonext
del Subject.¡Espero que esto sea útil!