Изменения объекта после подписки на наблюдаемые - PullRequest
0 голосов
/ 01 февраля 2019

Из x.component.ts я звоню getSomething() в y.service.ts.Я подписываюсь на getSomething(), потому что это возвращает наблюдаемое.Дело в том, что до .subscribe() у меня есть объект, который имеет 4 элемента внутри, один из которых является массивом числовых массивов (число [] []), а после .subscribe того жемассив теперь пуст.

x.component.ts

this.y
      .getSomething()
      .pipe(
        //make an observable to pass to child component 
        tap(data => (this.pautaFinal$ = of(data))),
        // This object is just for development purpose
        tap(data => (this.pautaFinal = data)),
        // This is to change the number[][] object into a number[][][]
        // I need it that way
        tap(
          data =>
            (this.escalaPorcionada = this.transformEscala(
              data.escala.escalaArr,
              10
            ))
        )
      )
      .subscribe();

// Makes an array of number arrays, into an array of arrays of chunkSize number arrays.
transformEscala(escala: number[][] = [], chunkSize: number): number[][][] {
    let results: number[][][] = [];
    while (escala.length) {
      results.push(escala.splice(0, chunkSize));
    }
    return results;
  }

В этом x.component я также попробовал вместо третьего tap a map(data => data.escala.escala), а затем`.subscribe (data => this.escalaPorcionada = this.transformEscala (data, 10).

y.service.ts
  getSomething(): Observable<Pauta> {
    let admin: DatosAdmin;
    let escala: Escala;
    let rubrica: Rubrica;
    let criterios: Criterios;
    this.datosAdminAcumul$.subscribe(datos => (admin = datos));
    this.escalaAcumul$.subscribe(datos => (escala = datos));
    this.rubricaAcumul$.subscribe(datos => (rubrica = datos));
    this.criteriosAcumul$.subscribe(datos => (criterios = datos));

    let user = JSON.parse(localStorage.getItem("user"));

    // Ultimos datos que agregar a la pauta.
    let extras = {
      usuarioModificacion: user.id
    };

    const pautaFinal: Pauta = {
      datosAdmin: admin,
      criterios: criterios,
      rubrica: rubrica,
      escala: escala,
      extras: extras
    };
    return of(pautaFinal);
  }

Это функция, которую я вызываю в y.service.ts. У нее есть некоторые наблюдаемые, которые находятся в той же службеон подписывается на них, получает некоторые значения, присваивает их чему-то другому, а затем всем этим, помещает их в объект pautaFinal, и это то, что я возвращаю как наблюдаемый .

Что я пробовал: Я проверил отладчик chrome и до подписки массив существует, после он пустой.

Это значение escalaArr внутри наблюдаемого this.escalaAcumul$ (от y.service) Before .subscribe() (escalaArr is the array that is lost)

Это после подписки. Только одна функцияЗвонок после предыдущего изображения.After .subscribe()

Этот объект имеет еще 4 элемента, и ни один из них не изменяется, просто escalaArr.

Я не знаю, что я делаю здесь неправильно.Я застрял на некоторое время и благодарен за помощь, спасибо.

1 Ответ

0 голосов
/ 01 февраля 2019

Попробуйте клонировать объект, переданный Observable, перед его обработкой.Таким образом вы нарушаете цепочку «по ссылке» в JavaScript.

this.y
  .getSomething()
  .pipe(
    //make an observable to pass to child component 
    tap(data => (this.pautaFinal$ = of(data))),
    // This object is just for development purpose
    tap(data => (this.pautaFinal = data)),
    // This is to change the number[][] object into a number[][][]
    // I need it that way
    tap(
      data =>
        (this.escalaPorcionada = this.transformEscala(
          Object.assign({}, data.escala.escalaArr), // <-- clone here to avoid changing the original
          10
        ))
    )
  )
  .subscribe();

Если это не решает проблему, проверьте, имеет ли какой-либо другой компонент доступ к установщику вашего Observable.

РЕДАКТИРОВАТЬ:

Вариант 2:

transformEscala(escala: number[][] = [], chunkSize: number): number[][][] {
    let results: number[][][] = [];
    const clone = Object.assign({}, escala);

while (clone.length) {
  results.push(clone.splice(0, chunkSize));
}
return results;

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...