Rxjs: Behavior Subject emite valor sem chamar next ()

Oct 05 2020

Estou criando um filtro de seleção múltipla com RxJs e usando um serviço angular para comunicar valores entre componentes.

@Injectable({
    providedIn: 'root'
  })
export class SomeService{

    private readonly defaulFilterSelect: SomeSelect[] = 
    [
      {
          id: 1,
          label: 'label 1',
          options: [
              { id: 2, isChecked: false},
              { id: 3, isChecked: false}
          ]
      },
      {
          id: 7,
          label: 'Label 2',
          type: { name: 'checkbox' },
          options: [
              { id: 4, isChecked: false},
              { id: 5, isChecked: false}
          ]
      }
    ]

    private filterSelectDataSource = new BehaviorSubject<SomeSelect[]>(this.defaulFilterSelect);

    filterSelectData$ = this.filterSelectDataSource.asObservable();

    public get getFilterSelectData(){
      return this.filterSelectDataSource.value;
    }
}

O fato é que, quando um usuário realiza algum trabalho na aplicação, a propriedade isCheckedda SomeSelectclasse pode se tornar verdadeira, e posteriormente o usuário tem a possibilidade de retornar ao estado inicial onde estavam todas as propriedades nomeadas "isChecked" false. Então eu pensei ... bem, se eu preciso que meu observável retorne ao estado inicial, por que não apenas next()meu valor inicial padrãodefaulFilterSelect

    uncheckAllOptions(){
      this.filterSelectDataSource.next(this.defaulFilterSelect); //here
  }

Por algum motivo, isso não está funcionando como eu esperava e, quando eu consolo o login em uma assinatura, obtenho o valor anterior do meu observável. Além disso, se eu modificar o objeto this.filterSelectDataSource.value, sem chamar next(obj)a IU ouve as mudanças e renderiza as mudanças que realmente me confundem, pois espero que apenas a chamada this.filterSelectDataSource.next(someNewObject);acionaria mudanças na IU que consomem aquele observável. Alguém pode me indicar a direção certa aqui? obrigado!

Respostas

2 RobertDempsey Oct 05 2020 at 17:33

Você precisa clonar profundamente defaulFilterSelectao defini-lo como seu valor inicial filterSelectDataSource, caso contrário, ao atualizá-lo, você estará atualizando a mesma referência de defaulFilterSelect.

Como você clona profundamente depende de você, mas geralmente uso Lodash cloneDeep.