2

Firebase를 백엔드로 사용하여 Angular2 응용 프로그램을 개발하고 있습니다. 서브 페이지에서 route 매개 변수로 지정된 주에 대한 일부 작업을 표시하려고합니다. 내가 쿼리 다음과 같은 식으로 AngularFire2에 매개 변수로 BehaviorSubject을 사용하고AngularFire2에서 Firebase 목록을 올바르게 쿼리하는 방법은 무엇입니까?

: 불행하게도

 this.taskTemplates$ = angularFire.database.list("/taskTemplates", { 
      query: { 
       equalTo: this.weekSubject 
      } 
     }); 
    } 

    ngOnInit() { 
     this.routeSub = this.route.params.map(
      (params: Params) => this.weekId = params[ 'weekid' ] 
     ).subscribe(
      weekId => this.weekSubject.next(weekId) 
     ); 
    } 

    ngOnDestroy() { 
     this.routeSub.unsubscribe(); 
    } 
} 

의 중포 기지 taskTemplates$ 관찰은 반환하지 않습니다 : 여기에

export class PrepareComponent implements OnInit { 

    private routeSub: any; 
    weekId = ''; 

    private weekSubject: BehaviorSubject<any> = new BehaviorSubject('weekId'); 

    taskTemplates$: FirebaseListObservable<TaskTemplate[]>; 

    constructor(private route: ActivatedRoute, 
       private router: Router, 
       private angularFire: AngularFire) { 

     // this.taskTemplates$ = angularFire.database.list("/taskTemplates"); 

는 중포 기지 쿼리입니다 주어진 weekId에 대한 모든 데이터.

weekId이 경로 매개 변수를 쿼리하여 설정되면 목록에서 쿼리 매개 변수로 가져와 { weekId: actualWeekId, ...}의 데이터를 반환한다고 가정했습니다.

{ 
    "-Kc_E0U4UOl9PPtxpzCM" : { 
    "description" : "asdfasdf", 
    "weekId" : "99f2" 
    }, 
    "-Kc_E3wv3fhpUt56sM4u" : { 
    "description" : "another task", 
    "weekId" : "99f2" 
    } 
} 

그래서 내가하고 싶은 것을 핵심 문제가 될 것으로 보인다 주어진 weekId

+0

질문에 데이터 표현을 포함시킬 수 있습니까? – cartant

+0

@cartant 질문에 예제 데이터를 추가했습니다. 도와 줘서 고맙다! – paweloque

답변

2

에 대한 모든 기록을 얻을 수 있습니다 :

편집는 중포 기지에 저장된 데이터의 예를 추가 observable리스트가 생성 될 때 지정된 query.

데이터의 구조를 보면 이있는 항목을 선택하려는 것으로 보이는 것처럼 orderByChild을 사용해야하는 것 같습니다.

질문 코드의 쿼리는 활성화 된 경로에서 얻은 weekid과 동일한 키를 가진 항목을 찾습니다. 그러나 키는 -Kc_E0U4UOl9PPtxpzCM과 같은 푸시 키입니다.

활성화 된 경로에서 직접 관찰 할 수있는 쿼리를 구성하여 코드를 다소 단순화 할 수도 있습니다. 이런 식으로 뭔가 당신이 원하는 일을해야합니다

export class PrepareComponent implements OnInit { 

    taskTemplates$: FirebaseListObservable<TaskTemplate[]>; 

    constructor(
    private route: ActivatedRoute, 
    private router: Router, 
    private angularFire: AngularFire 
) {} 

    ngOnInit() { 
    this.taskTemplates$ = this.angularFire.database.list("/taskTemplates", { 
     query: { 
     orderByChild: 'weekId', 
     equalTo: this.route.params.map((params: Params) => params['weekid']) 
     } 
    }); 
    } 
} 

당신이 orderByChild를 사용하는 경우 당신은 가능성이 콘솔 인덱스에 대한 경고가 표시됩니다 - 당신은 이미 하나를 작성하지 한 경우. 이를 수행하려면 보안 규칙을 사용해야합니다. 문서에서 충분히 설명되어야합니다.

+0

좋아요, 이제 작동합니다! 성능에 대한 고려 때문에'.indexOn'을 사용하라는 경고 메시지가 나타납니다. 이 부분을 어디에서 지정해야합니까? – paweloque

+0

Firebase Rules 섹션에서 발견했습니다. – paweloque

관련 문제