Подтвердить что ты не робот

Angular2 Служба наблюдаемого поведения. Не работает.

Я пытаюсь создать свой собственный наблюдаемый сервис, но после того, как я получу исходные данные из службы, любые обновления службы не распространяются на всех подписчиков. Сервис выглядит следующим образом:

import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs/Rx';

@Injectable()
export class DataService {
  keys : number[] = [4,5,1,3,2];
  private data :BehaviorSubject<number[]> = new BehaviorSubject(this.keys);

  constructor() {};

  public setKey(i:number, val:number) :void {
    this.keys[i]=val;
    this.data.next(this.keys);
  }
  public getData() :Observable<number[]> {
    return new Observable(fn => this.data.subscribe(fn));
  }
  public getKeys() :number[] {
    return this.keys;
  }
}

компонент, использующий службу, получает начальные данные просто отлично. этот компонент получает свои данные в конструкторе:

constructor(public dataService: DataService) {
    dataService.getData().subscribe(data => {
      console.log("Gotcha!");
      this.data.datasets[0].data = data)
    });
};

который дает один Gotcha в журнале консоли. Но после обновления данных с помощью setKey (2,3) где-то еще, я ожидал   this.data.next(this.keys); для передачи данных всем абонентам, и данные будут обновляться внутри этого компонента соответственно. но никакие данные не отправляются подписчикам.

Я думал, что понял фигуры Observables, но, пожалуйста, не дружайте, если я пропущу точку здесь;) любые указатели в правильном направлении будут очень благодарны!

4b9b3361

Ответ 1

Каждый раз, когда вы испускаете значение, вы должны создать новый объект вместо того, чтобы испускать тот же мутированный объект. Это защитит вас от проблем с обнаружением изменений. Было бы лучше всегда назначать новый объект this.keys, когда вы его меняете.

this.data.next([...this.keys]);

Вы можете использовать asObservable() здесь

public getData(): Observable<number[]> {
  return this.data.asObservable();
}

Также проверьте, что сказал Гюнтер Цохбауэр. Предоставляете ли вы услугу как одиночный?

Ответ 2

В какой-то момент я столкнулся с той же проблемой. Вероятно, причина в том, что ваш сервис не является ничем, т.е. Каждый абонент получает новый экземпляр. В отличие от Angular 1, в службах A2 нет одиночных пакетов.

Если вы хотите иметь один экземпляр службы, разделяемой несколькими службами/компонентами, поместите ее в providers вашего родителя @Component или @NgModule.

@NgModule({
  declarations: [],
  imports: [],
  bootstrap: [AppComponent],
  providers: [DataService]
})
export class AppModule {
}