2

나는 이것에 미쳐 가고있어, 청중에게 복종한다.Angularfire2의 가치를 되찾기

Observable을 반환해야합니다. 먼저 Firestore를 호출하여 배열이 포함 된 필드를 검색 한 다음 배열의 각 값을 기반으로 일치하는 키를 검색하려고합니다. 상당히 쉽습니다.

콘솔에 무엇이 들어 있는지 정확히 알 수 있습니다. 데이터는 여기에 있지만 도대체 왜보기에는 나타나지 않습니다. 내가 포기하기 전에, 나는 아래의 수많은 변형을 만들었다.

내 서비스 - 제안 사항을 반영하도록 수정 됨. 아직 생성자에서 public agendaData: Observable<any>

다음 내 구성 요소

getUserActivites() { 

    console.log(this.userId) 
    let array = [] 

    const agenda = this.afs.doc(`users/${this.userId}`).snapshotChanges() 

    agenda.subscribe(list => { 
     const data = list.payload.data().activities 
     data.map(event => { 
     const id = event 
     const dataRef = this.afs.doc(`activities/${event}`).valueChanges() 
     dataRef.subscribe(date => { 
      array.push(date) 
      console.log(array) //array log the expected data in an array of Object 
      return data 
     }) 
     }) 
    }) 
    return agenda 
    } 

작동하지

this.agendaData = this.agenda.getUserActivites()

내보기

<div *ngFor="let item of agendaData | async "> 
{{ item.name }} 
</div> 
+0

안녕하세요 @Benoit. 내가 이해하는지 모르겠다. 문제는 항목의 '키'를 표시 할 수 없다는 것입니다. 또는 모든 데이터 (예 :'item.name')? 파이어 스토어에 '열쇠'가 없기 때문에 파이어 스토어에는 열쇠가 없습니다. 매핑하고 배열에 포함하려면 [snapshotChanges() 메서드] (https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md#snapshotchanges)를 사용해야합니다. – Will

+0

내 문제는 데이터를 전혀 표시 할 수 없다는 것입니다. 이 시나리오에서는 키가 필요하지 않습니다. 난 그냥 선택한 문서의 목록을 검색하고 싶습니다. 선택은'list.payload.data(). activities'에 호스팅 된 키를 기반으로합니다. – Benoit

+0

구독 문제에서 데이터를 반환하려고했으나 작동하지 않습니다. https://stackoverflow.com/question/39295854/angular-2-how-to-return-data-from-subscribe – Alex

답변

0

getUserActivities =() => {작동합니까?

날짜가 관측 가능합니까?

this.observableBooks = this.bookService.getBooksWithObservable();

getBooksWithObservable() : Observable { 반환 this.http.get (this.url) .map ((res : Response) => res.json());

죄송합니다. 귀하의 질문에 대한 답변을 찾을 수없는 경우 여기에 어떤 문제가 있는지 직접 알고 싶습니다.

1

1) subscribe()을 (를) this.afs.....snapshotChanges() (으)로 깜빡 한 것 같습니다. Promise와 Observables의 차이점 중 하나는 Observables가 게으르다는 것입니다. 작업을 시작하려면 Observables를 구독해야합니다.

2) 키/아이디가 필요하지 않은 경우 사용하기 쉬운 valueChanges()을 사용해야합니다. 예 (테스트하지 않음) :

getUserActivites() { 
    let agenda = [] //Created for logging only 

    let usersTask = this.afs.object(`users/${this.userId}`).valueChanges();  
    let myReturnTask = usersTask.subscribe(users => {   
     console.log('received users'); 
     users.map(user => {    
      const dataRef = this.afs.doc(`activities/${user.id}`).valueChanges() 

      dataRef.subscribe(date => { 
       agenda.push(date) //For logging purpose I created this array 
       console.log(agenda) //Here I see exactly what I want! 

       return date // Why date is not returned? 
      }) 
     }) 
    }) 

    return myReturnTask; 
} 
+0

감사합니다. @Makah, 다음'dataRef'를 요청하기 전에'payload'를 읽어야 할 때'snapshotChanges()'를 사용해야합니다. . 위의 코드를 제안과 함께 업데이트하지만 아직 작동하지 않습니다. 내 구성 요소에서'this.agendaData = this.agenda.getUserActivites()'가받은 값을 어떻게 계산할 수 있습니까? – Benoit

+0

@Benoit console.log()로 디버깅 해보고 얻은 것을 확인하십시오.Observable을 반환한다는 이유로 동 기적으로 확인할 수 없습니다. 코드를 약간 변경하여 도움을줍니다. – Makah

+0

Firestore 문서를 갓 읽음'Cloud Firestore는 배열을 저장할 수 있지만 배열 구성원을 쿼리하거나 단일 배열 요소를 업데이트하는 것을 지원하지 않습니다. 그래서 Firestore에서는 할 수있는 일이 불가능합니다. 단일 액티비티를 호스팅하는 단일 구성 요소를 작성한 다음 list.payload.data(). 액티비티의 배열을 기반으로 이러한 단일 구성 요소를 작성하여 내 견해를 다시 생각해 보겠습니다. – Benoit