es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Valor observable claro al llamar a la función

Tengo un menú desplegable que obtiene valores de un servicio.

Menú desplegable

<mat-select *ngif="selectedCloudTypeName === 'AWS'" class="select--width--130" [formcontrol]="awsOwnersControl" placeholder="AWS Owners" msinfinitescroll="" (infinitescroll)="loadMoreAwsOwners()" [complete]="currentAwsOwnerssDropdownOffset >= awsOwnersTotalCount">
  <mat-option *ngfor="let owner of awsOwners$ | async" [value]="owner.id">
    {{ owner.name }}
  </mat-option>
</mat-select>

Llamada al servicio en el archivo TS

getAwsOwners(offset = 0) {
  this.isLoading$.next(true);
  this.awsService
    .getOwnersListForAws(this.selectedCredentialIdForCloudType, this.selectedPlatform, { offset, limit: 100 })
    .subscribe(
      (owners: PaginatedResult<commonenumvalue[]>) => {
        this.awsOwners.next(owners.data);
        this.awsOwnersTotalCount = owners.totalCount;
        this.isLoading$.next(false);
      },
      (error) => {
        this.isLoading$.next(false);
        this.alertify.error(error);
      },
    );
}

En el método OnInit, utilizo un Observable

this.awsOwners$ = this.awsOwners.asObservable().pipe(scan((acc, curr) => [...acc, ...curr], []));

que declaro como propiedad en el archivo

awsOwners = new BehaviorSubject<commonenumvalue[]>([]);
awsOwners$: Observable<commonenumvalue[]>;

El problema es que cuando llamo a la función getAwsOwners con un valor diferente de selectedPlatform, los datos antiguos persisten y se añaden los nuevos datos.

He intentado borrar el subject awsOwners de esta manera

this.awsOwners.next([]);

antes de llamarlo, pero no lo borra y los nuevos datos se añaden a los antiguos.

¿Hay alguna forma de limpiarlo?

Siento que en el operador scan debo limpiar el .acc de alguna manera porque acumula los valores.</commonenumvalue[]></commonenumvalue[]></commonenumvalue[]>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para vaciar el sujeto awsOwners, puede llamar al método complete() en él, que emitirá una notificación completa y lo obligará a cancelar el registro de todos los observadores. Luego puede crear una nueva instancia de BehaviorSubject para reemplazar la antigua.

    Aquí hay un ejemplo de cómo modificar el método getAwsOwners() para vaciar el sujeto awsOwners antes de cada nueva llamada:

    getAwsOwners(offset = 0) {
      this.isLoading$.next(true);
      this.awsOwners.complete(); // completar el BehaviorSubject
      this.awsOwners = new BehaviorSubject<commonenumvalue[]>([]); // crear una nueva instancia
      this.awsService
        .getOwnersListForAws(this.selectedCredentialIdForCloudType, this.selectedPlatform, { offset, limit: 100 })
        .subscribe(
          (owners: PaginatedResult<commonenumvalue[]>) => {
            this.awsOwners.next(owners.data);
            this.awsOwnersTotalCount = owners.totalCount;
            this.isLoading$.next(false);
          },
          (error) => {
            this.isLoading$.next(false);
            this.alertify.error(error);
          },
        );
    }
    

    Esto asegurará que cada llamada a getAwsOwners() comience con un awsOwners vacío.</commonenumvalue[]></commonenumvalue[]>

Comments are closed.