Angular2 Observable更新私有变量

Angular2 Observable updating private variable

不确定我问的问题是否正确,但我有一项用于在不同组件之间共享数组对象的服务。但是,当我将新对象提交给服务时,某些东西正在更新我的服务数组中的所有其他对象。

即 第一推 答案 = [{questionId: 1, value: 1}] 第二次推送 {questionId: 1, value: 3} answers = [{questionId: 1, value: 3}, {questionId: 1, value: 3}]

注意如何更改值以匹配新推送的答案对象的值。

这是我的服务

export interface Answer {
  questionId: number;
  value: number;
}

  private answers: Answer[] = [];
  private _answers: BehaviorSubject<Answer[]> = new BehaviorSubject([]);
  public answers$ = this._answers.asObservable();


  addAnswer(answer: Answer) {
    this.answers.push(answer);
    this._answers.next(this.answers);
  }

这是我的组件

export class LevelComponent {
  subscription: Subscription;
  answer: Answer = {questionId: 0, value: 0}; 
  a: Answer[];
  constructor(public route: ActivatedRoute, public answerService: AnswerService) {

  }

  ngOnInit() {

    this.subscription = this.answerService.answers$.subscribe(item => this.a = item);


  }
  ngOnDestroy() {
    // prevent memory leak when component is destroyed
    this.subscription.unsubscribe();
  }


  submitAnswer(e){
    console.log(e.target.id);
    this.answer.questionId = 1;
    this.answer.value = e.target.id;

    this.answerService.addAnswer(this.answer);
  }

基本上我正在寻找 'share' 跨多个组件的一系列答案,但对 BehaviorSubject 和订阅的有限理解一直困惑为什么在向服务中的数组添加新项目后,会它更新所有其他对象。附带说明一下,如果我将答案 var 更改为只是一个数字,则当我提交答案时数组中的值不会改变。

这是一个 Plunker 说明我所看到的。

可能是因为你这样做:

this.answers.push(answer);
this._answers.next(this.answers);

当你只需要这样做时

this._answers.next(answer);

I.E 通过使用整个数组调用 next,您的订阅者将收到整个数组作为下一项,而不仅仅是下一项。

感谢那些看过我问题的人。

事实证明我的服务是正确的并且按预期运行。问题是我每次都将我的答案的相同引用传递给 addAnswer 调用,因此它正在更新引用的答案,这又更新了数组中的每个对象。

解决方法是每次在提交前声明一个新答案。

  submitAnswer(e){
    let answer: Answer = {questionId: 1, value: e.target.id};
    this.answerService.addAnswer(answer);
  }