2017-11-26 4 views
1

Angular2 프레임 워크를 처음 사용했습니다. 기본 질문 인 경우 용언입니다.angular2의 서비스 레이어에서 개체 수정 : 구독을 관찰 할 수있는 유형에 할당 할 수 없습니다.

http 래퍼를 통해 반환 된 서비스 계층에서 개체를 처리하고 있습니다. 이 객체는 구성 요소로 전달되어야하지만 먼저 데이터를 조작하고 필요한 데이터 만 추출하여 전달해야합니다.

이렇게하려고하면 "구독을 관찰 가능 유형에 할당 할 수 없습니다"라는 오류 메시지가 나타납니다. 여기 내 마음에 감각이 돌아 스트리밍으로 먼저 가입 내부의 데이터를 변환하는 것입니다하게하고 명시 적으로 객체를 반환하지만,이 또한 원하는 출력을 제공하지 못하는 어떤 코드

이제
return this.httpGet<UserInfo[]>(url, {headers}).switchMap(data => data) 
.subscribe(
    data => { 
     console.log("new values are going to be" + JSON.stringify(data[0].address.addressLine1)); 
     this.userInfo[0].name = "test name"; 
     this.UserInfo[0].address.city = data[0].address.city; 
     this.UserInfo[0].address.state = data[0].address.state; 
    }, 
); 

이있다, 유형이 관찰 가능하더라도. Java oop 배경에서 나는 여기서 어떤 이슈가 철저하게 혼란스러워하는지 볼 수 없다. 모든 통찰력이 인정됩니다.

편집 : 서비스 호출이되는 경우 여기에 완료입니다 - 현재 코드에서

this.inputFormControl.valueChanges 
.debounceTime(4000) 
.switchMap(query => this.userService.search(query)) 
.subscribe(
    data => { 
     this.data = data; 
    }, 
); 
+1

서비스 작업을 호출하는 곳을 표시 할 수 있습니까 –

답변

0

, 대신 피 감시의 구독을 반환하는 패턴 다음보십시오. 또한 나는 왜 당신의 서비스에서 switchMap의 사용이 필요한지 알지 못한다. (나는 당신이 당신의 서비스에서 당신의 http 요청을 가지고 있다고 가정한다. 그래서 서비스에서 map을 수행하고 데이터를 수정 한 다음 구성 요소로 반환하십시오.

한 가지 더 지적하려면 현재 코드에서 http-request에서 아무 것도 반환하지 않으므로 return 문을 추가해야합니다.

return this.httpGet<UserInfo[]>(url, {headers}) 
    .map(data => {   
    this.UserInfo[0].name = "test name"; 
    this.UserInfo[0].address.city = data[0].address.city; 
    this.UserInfo[0].address.state = data[0].address.state; 
    return this.UserInfo; // add return! 
    }); 

구성 요소 코드는 그대로 있습니다.

+0

정답입니다. 나는 비슷한 것을 시도 했었지만, 실제로지도 방법으로부터의 수익의 연쇄 화가 나를 벗어 버렸다. 또한 subscribe 메서드 내에서 데이터를 수정하려고 시도했습니다. 통찰력에 감사드립니다. 고맙습니다. – zo0

0

, 당신은 이미 관찰에 가입했다. 따라서 Observable 대신 Subscription을 반환합니다. 그런 다음 호출 함수에서 이것을 관찰 가능 객체에 할당하려고합니다.

다른 답변에서 언급 한 바와 같이
someFunction() { 
    return this.httpGet<UserInfo[]>(url, {headers}).switchMap(data => data) 
    } 

    callingFuction(){ 
    someFunction().subscribe(
     data => { 
      console.log("new values are going to be" + JSON.stringify(data[0].address.addressLine1)); 
      this.userInfo[0].name = "test name"; 
      this.UserInfo[0].address.city = data[0].address.city; 
      this.UserInfo[0].address.state = data[0].address.state; 
     }, 
    ); 
    } 
+0

내 전화 기능이 http 기능이기 때문에이 솔루션은 의미가 없습니다. – zo0

+0

전체 코드를 게시 할 수 있습니까? –