2016-07-29 10 views
0

Angular 2 RC4 응용 프로그램은 TypeScript 1.9 작성 변수 RxJS 5 beta 6RxJS 내 읽을 수

내가 가입 할 때 내 클래스 변수가 관찰 생성 함수에 전달되지 않는 이유 이해하기 정말 힘든 시간을 보내고있어 왜 일명 5 관찰 가능한 변수 범위 . 내 코드는 다음과 같습니다하지만 새로운 값을 방출 할 때 입력 = 뭔가

  • start()

    • 신청하기를 호출하여 구독을 시작할 때 당신은 (는 at this Plunker 실행을 참조하십시오 app/app.component.ts

      //this is the problematic var. Can't pass its updated value to the Observable 
      input = 'nothing'; //<- default value 
      
      ngOnInit(){//<- this runs right after class constructor 
          //set to the value we want to send to the server 
          this.input = 'something'; 
      } 
      start(){ 
          //to make sure input = something when we subscribe 
          this.print("Subscribing when input = "+this.input); 
          this.source.subscribe(d=>this.print(d)); 
      } 
      //Simulate sending input to the server 
      source = this.queryServer(this.input) 
          .do(()=>this.print('Emitting new value...')); 
      
      //server just returns what it received 
      queryServer(input){return Observable.from(['Server sees '+input])} 
      
      print(value){this.log.push(value);} 
      log=[]; 
      

      출력을 볼 수 있습니다. ..

    • 서버에서 아무 것도 볼 수 없음

    우리는 구독을 호출 할 때 클래스 속성이 something인데 어떻게 되니 queryserver()nothing이 전달됩니까? 나는 과 같은 객체를 input={d:'something'}과 같은 객체로 만들려고했는데, 아마도 문제는 참조 대신 값을 전달하는 것과 관련이 있지만 결과는 같았을 것이라고 생각했습니다.

  • 답변

    1

    구성 요소를 구성 할 때 input의 기본값을 queryServer으로 전달하기 때문에이 문제가 발생합니다. ngInit에서 변경하더라도 이미 가입 한 파이프 라인을 구성하는 데 이미 사용되었습니다. 당신은 기본적으로 다음과 같은 일을 :

    this.input = "nothing"; 
    const copyOfInput = this.input; 
    this.input = "something"; 
    console.log(copyOfInput); //-> nothing 
    

    당신은 this.input가 가리키는 어떤 변경하지만 그것의 사본이 여전히 만든 이전 값을 가리키는. 나는 당신이 실제로 ngInit에서 파이프 라인을 초기화하고 객체의 구성의 일부가 아니라고 가정합니다.

    +0

    "input = something"설정 후 관찰 가능 체인을 구성하면 새로운 값이 사용된다는 것은 맞습니다. 자주 변경되는 모델 변수가 있고 업데이트 된 값을 서버에 보내야 할 때마다 모든 변경 사항에서 관찰 가능 항목을 다시 작성해야하기 때문에 이는 실제로 제한적으로 보입니다. 예를 들어 여기에있는 예제에서'input'은'ngOnInit'이 완료된 후에도 계속 변경 될 것입니다. 그래서 다음에'queryServer'를 호출해야 할 때'source'를 다시 작성해야합니까?Rx 팀이'subscribe()'를 호출 할 때까지 아무 일도하지 않는다는 것을 알려주기 때문에이 모든 것이 놀랍습니다. – BeetleJuice

    +0

    그런데 데모 코드를 사용하면'input'이 실제로 객체인지 문자열 대신에'copyOfInput'과'input'은 똑같은 것을 참조 할 것입니까? 그래서 내가 객체를 사용하면 일을 기대하지만, OP에서 기술 한 동작은 그 경우에도 유지됩니다 (예 : 변수를 선언 할 때'input = {d : 'nothing'} '을 설정하면 'input.d = 'something'in'ngOnInit()') – BeetleJuice

    +0

    구독하기 전까지는 아무 일도하지 않고, 가입 할 때 하나의 이벤트 만 내보내는 파이프 라인을 만들고 있습니다. 당신이 상태를 직접 변이시킬 때. 그리고 Observable에 실제로 전달한 값인 새 문자열을 만들기 위해이 값을 사용하기 때문에 객체와도 작동하지 않습니다. 제안 된 솔루션으로 업데이트하겠습니다. – paulpdaniels

    0

    유용한 입력에 대해 @paulpdaniels에게 감사드립니다. 그는 내가 input=something을 설정 한 후에 ngOnInitsource을 작성하라고 제안했습니다. input의 첫 번째 값은 작동하지만 실제로는 inputngOnInit이 완료된 후에도 계속 변경되므로 source은 다시 쓸모없는 데이터를 방출합니다.

    아직도 내가 놀랍게 들리는 것은 입력이 개체 (단순한 문자열이 아닌) 일지라도 OP의 문제가 지속된다는 것입니다. JS에서 참조로 객체를 할당했기 때문에 나는 다르게 기대했다.

    내가 선택한 코드 디자인은 에 대한 설정자 안에 source을 작성하는 것입니다. 그런 식으로, 그 값이 설정 될 때마다, source는 새로 고침 : 그래서 아마 더 좋은 방법이 없습니다

    source:Observable<any>; 
    
    _input = 'nothing'; 
    get input(){return this._input;} 
    set input(val){ 
        this._input = val; 
        source = this.queryServer(val) 
         .do(()=>this.print('Emitting new value...')); 
    } 
    

    아직도 해킹-Y 나에게 느낌하지만 관찰 가능한 것이 새로운 브랜드입니다. 있다면 누군가가 나에게 가르쳐주기를 바랍니다.

    관련 문제