2017-02-04 3 views
0

У меня есть кусок данных, доставляемых дочернему компоненту через @Input, что console.logs, но когда я иду для работы с данными он выдает ошибку, говоря, что объекты, к которым я пытаюсь получить доступ, не существуют по типу FirebaseObjectObservable<any>.«Свойство« ... »не существует по типу FirebaseObjectObservable <any>« Ошибка при работе с данными, полученными с помощью @Input

Вот как фрагмент данных структурирована

"questions" : { 
     "question01" : { 
      "id"  : "an ID", 
      "name"  : "a name", 
      "question" : "a question", 
      "answers" : { 
       "answer01" : { 
        "answer" : "some answer", 
        "id"  : "an ID" 
       }, 
       "answer02" : { 
        "answer" : "another answer", 
        "id"  : "an ID" 
       } 
      } 
     }, 
     "question02" : {....}, 
     "question03" : {....} 
    } 

Внутри дочернего компонента он доставляется в этом

@Input('busImageQuesI') 
questions: FirebaseObjectObservable<any>; // console.logs the questions showing they made it safely to the component. 

Этот ребенок компонент будет использоваться в других родительских компонентов и имеет собственный ребенок компонент для заполнения в зависимости от того, какой родительский компонент он вызывает. До сих пор я полагал, что буду использовать инструкции if для определения того, какие наборы данных будут отображаться. До сих пор это выглядит так

expbTrigger: boolean = false; 
rebbTrigger: boolean = false; 
newbTrigger: boolean = false; 

ngOnInit() { 

    var myLocation = window.location.pathname; 


    if (myLocation.includes('expand')){ 
     this.expbTrigger = true; 

    } else if (myLocation.includes('recreate')){ 
     this.rebbTrigger = true; 

    } else if (myLocation.includes('new-business')){ 
     this.newbTrigger = true; 
    } 

    console.log(this.expbTrigger, this.rebbTrigger, this.newbTrigger); 
} 

Я использую, что для переключения других элементов в шаблоне, как этого

<multiple-choice-radio *ngIf="expbTrigger"></multiple-choice-radio> 
<multiple-choice-radio *ngIf="rebbTrigger"></multiple-choice-radio> 
<multiple-choice-radio *ngIf="newbTrigger"></multiple-choice-radio> 

Я делаю это, чтобы отправить вопросы, которые я хочу на основе родительского компонента потому что ни один из них не является эксклюзивным только для одной части, но они не все используются во всем, поэтому я решил, что я просто установил их вручную и использовал *ngIf, чтобы включить и выключить их, когда это необходимо.

questions Объект, полученный @Input, имеет 3 вопроса. если expbTrigger = true я хочу использовать вопросы 1 и 2. Если rebbTrigger = true я хочу использовать вопрос 3. Я понял, этот код будет работать

questionA: FirebaseObjectObservable<any>; 
questionB: FirebaseObjectObservable<any>; 

ngOnChanges(){ 
    if(this.expbTrigger = true){ 
     this.questionA = this.questions.question01; 
     this.questionB = this.questions.question02; 
    } else if(this.rebbTrigger = true){ 
     this.questionA = this.questions.question03; 
     this.questionB = null; 
    } 
} 

, но я получаю эту ошибку

Property 'question01' does not exist on type 'FirebaseObjectObservable<any>' 

и он говорит то же самое для вопросов 2 и 3. Когда я прокомментирую код и делаю console.log(questions), он регистрирует его и отображает все вопросы внутри него. Я попытался переместить его в ngAfterViewInit, а также получил ту же ошибку. Каждый пример, который я вижу, - это всего лишь один единичный уровень данных, поэтому трудно сказать, что я делаю неправильно в отношении поиска вложенных тел данных. Может ли кто-нибудь помочь?

ответ

0

Я думаю, что лучше использовать объект вместо наблюдаемого для хранения данных. Но даже в этом случае вы получите сообщение об ошибке, потому что вам придется предопределять интерфейс, чтобы он соответствовал данным, которые вы собираетесь получать. Если у вас его нет, вы можете получить доступ к следующим объектам: this.questions['question01'];