Búsqueda de sitios web

angular - ¿Cómo activar la detección de cambios cuando se modifica un objeto en un array?


En mi aplicación angular4 tengo un componente con una directiva *ngFor basada en un arreglo:

 <div *ngFor="let person of persons">
   {{person.name}}
   {{person.car}}
 </div>

En la otra parte del componente, puedo eliminar un coche, así que en el subscribe del método deleteCar() actualizo el array persons a:

 deleteCar(car) {
   this.carService.deleteCar(car).subscribe(() =>  {
   this.persons.filter(obj => obj.car == car.name)
               .forEach(i => i.car = null);
   }
 }

El problema es que el bucle *ngFor no se activa cuando modifico un objeto de persona existente en el arreglo de personas. ¿Cómo resolver esto?

Respuesta #1

Lo resuelvo desestructurando el arreglo. No estoy seguro de que sea la mejor manera de hacerlo.

this.persons = [...this.persons];

En la medida en que cambie la referencia del arreglo, Angular notará que el arreglo ha sido actualizado.

Respuesta #2

La mejor manera de lograr esto es tener un sujeto de comportamiento en un servicio y acceder a él en tu componente.

Entonces tu clase de servicio puede verse así

@Injectable()
export class PersonService {

private persons=  new BehaviorSubject<any[]>([]);
public persons$ = this.persons.asObservable();//--> You can access this in your component

constructor() {
   //set the persons array here;
}

function deleteCar()//todo  

}

En el componente

constructor(private personService: PersonService) {

}



ngOnInit() {
    this.persons= this.personService.persons$//Dont forget to do add the assync pipe or subscribe
}

delete(car){
    this.personService.deleteCar(car);
}

Esto debería funcionar.

Más información en -> https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service