我有一块数据通过console.log的@Input
传递到子组件,但当我处理数据时,它会抛出一个错误,说我试图访问的对象在类型FirebaseObjectObservable<any>
上不存在。
以下是数据块的结构
"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
来打开和关闭它们。
@Input
接收到的questions
对象中有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
中,但也出现了同样的错误。我看到的每个例子几乎都是一个单层数据,所以很难判断我在检索嵌套数据体方面做错了什么。有人能帮忙吗?
我认为最好使用对象而不是可观察对象来保存数据。但即使在这种情况下,您也会得到一个错误,因为您必须预定义接口以匹配您将要接收的数据。如果你没有,你可以这样访问属性:this.questions['question01'];