2016-12-08 4 views
0

질문을 올바르게 물어 볼 지 모르지만 다른 구성 요소간에 배열 객체를 공유하는 데 사용되는 서비스가 있습니다. 그러나 새 객체를 서비스에 제출하면 무언가가 내 서비스 배열의 다른 모든 객체를 업데이트하고 있습니다.Angular2 Observable Observable 사적인 변수 업데이트

즉 제 푸시 응답의 = [{questionId : 1 값 : 1}]와 제 푸시 {questionId : 1 값 : 3} 응답의 = [{questionId : 1, 값 3}, { 질문 ID : 1, 값 : 3}]

새로 푸시 된 응답 개체의 값과 일치하도록 값이 변경되는 방식에 유의하십시오.

이 내 구성 요소를 기본적으로

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); 
    } 

난에 '공유'여러 구성 요소에서 답변의 배열을 찾고 있어요,하지만 BehaviorSubject 및 구독의 제한으로 이해 내 서비스

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); 
    } 

입니다 서비스중인 배열에 새 항목을 추가 한 후에 다른 모든 객체를 업데이트하는 이유에 대해 당황 스럽습니다. 참고로, 만약 내가 단지 숫자가되도록 변수 var를 변경하면, 배열의 값은 응답을 제출할 때 변경되지 않습니다.

여기 내가보고있는 것을 보여주는 Plunker입니다. 아마

+0

* "다른 모든 개체 업데이트"* 무엇을 의미합니까? [mcve]를 줄 수 있습니까? – jonrsharpe

+0

이 응답 개체의 업데이트 방법에 대한 예제로 업데이트되었습니다. – utd1878

+0

@jonrsharpe가 플 런커를 추가했습니다. – utd1878

답변

0

내 질문에 감사하는 사람들에게 감사드립니다.

그래서 내 서비스가 정확하고 예상대로 작동하는 것으로 나타났습니다. 문제는 매번 동일한 대답을 addAnswer 호출에 전달했기 때문에 참조 된 응답을 업데이트 했으므로 배열의 각 객체를 업데이트하는 것이 었습니다.

해결 방법은 제출하기 전에 매번 새로운 대답을 선언하는 것이 었습니다.

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

당신이 일을하기 때문에 : 당신은 전체 배열을 다음 호출하여이

this._answers.next(answer); 

IE를 할 필요가있을 때

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

, 가입자는 다음과 같이 전체 배열을 받게됩니다 다음 항목이 아니라

+0

_answers는 BehaviorSubject 입니다. Answer는 하나의 Answer 객체입니다. 어떻게하면 새로운 답변을 _answers var에 넣을 수 있을까요? – utd1878

관련 문제