2017-05-20 9 views
0

[오류 : NgFor는 배열과 같은 반복문에만 바인딩을 지원합니다. ]ArrayQuery 함수 GraphQL에서 Observable을 반환하지만 * ngFor 오류가 발생했습니다

내가 뭘 잘못하고 있니?

View Code : 
<div *ngFor="let item of data| async" class="wide-box"> 

구성 요소 코드 :

public data : ApolloQueryObservable 

public feed(){ 
    var a = gpl` 
    query user($user: UserInput){ 
    user(user:$user){ 
     first_name 
     lync{ 
      artist 
      title 
      albumArtUrl 
      listenon 
      date 
      author{ 
       username 
       email 
      } 
     } 
     following{ 
      lync { 
       artist 
       title 
       albumArtUrl 
       listenon 
       date 
       author{ 
        username 
        email 
       } 
      } 
     } 
    } 
} 
`; 
this.data = this.apollo.watchQuery({ 
    query: a, 
    variables: { 
      user: { 
       email: window.localStorage.getItem('email') 
      } 
     } 
    }).map((x:any)=>x.data.user[0]).map(x=>{ 
     this.feedItem = [] 
     if(x.lync.length){ 
      x.lync.map(l=>{ 
       if(l!=undefined){ 
        this.feedItem.push(l) 
       } 
      }) 
     } 
     if(x.following){ 
      x.following.map(y=>{ 
       if(y.lync.length != 0){ 
        y.lync.map(l=>{ 
         if(l!=undefined){ 
          this.feedItem.push(l) 
         } 
        }) 
       } 
      }) 
     } 

     console.log(this.feedItem, "feedItem") 
     return ApolloQueryObservable.of(this.feedItem) 
    }) 

는 서버에서 데이터를 다시 반입하려면 watchQuery 함수를 호출하고지도 기능의 일부 사후 처리를 수행하고, 배열의 관찰 가능한 반환

public refresh(){ 
    this.data.refetch() 
    } 
+0

나는 단지 http://dev.apollodata.com/angular2/queries.html#합니다 ([문서]에 몇 분을 소비 한 this.data가 null로 채워집니다 가능성이 높습니다 select-pipe)하지만 당신의 모든 접근 방식은 완전히 그럴듯한 것 같습니다. 예를 들어 비동기 파이프로 작업하는 섹션에 직접 연결 한 것입니다. 예상했던대로, 문서화는 : 1. ngOnInit() 훅에서 watchQuery를 설정하는 것을 분명히 권고한다. 2. 함수에서 직접 observable을 깨끗하게 리턴한다. '.map()'처리가 실제로 구조를 망치는 것처럼 보입니다. 특히'x.data.user [0]'는 정말로 틀린 것 같습니다. –

답변

0

나는 어떤 일이 일어나는지 알지 못하지만 watchQuery의 마지막지도 연산자가 어떤 객체도 반환하지 않는다는 것을 알았다.

따라서는

+0

'.map()'문 안에'.push()'연산이 있음에 유의하십시오. 그리고 그들은 아마도 명확성을 위해'.forEach()'로 쓰여졌을 것입니다. 또는 확산 연산자를 사용하는 것이 좋습니다. 기대되는 리턴 값은'this.feedItem'의 값입니다. 그래서'.map()'문장에'return'이 없기 때문에 아닙니다. –