【问题标题】:@Input not receiving data from parent component@Input 没有从父组件接收数据
【发布时间】:2017-02-03 21:17:21
【问题描述】:

我刚开始使用 Angular 的 @Input 功能,到目前为止一切都很好。我使用 Firebase 作为我的数据库,我调用的数据块看起来像这样

{
    "page_area_business_image"      : {
        "expand"    : {
            "intro" : "some info...",

            "title" : "a title"
        },
        "rebrand"   : {....},
        "newbrand"  : {....},
        "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"    : {....}
        }
    }
}

我现在唯一遇到的问题是让子组件读取 questions 数据,而 console.log()s 在父组件中非常好,这意味着服务文件正在交付它。我是这样称呼它的。

父组件

private busExpInformation:  FirebaseObjectObservable<any>;

private busImageO:          FirebaseObjectObservable<any>;
private busImageQuesO:      FirebaseObjectObservable<any>;



constructor(private _homeService: HomeService) { }



ngOnInit() {
    this._homeService.getBusExpInformation().subscribe(BusExpInformation =>{
        this.busExpInformation = BusExpInformation;
    });

    this._homeService.getBusImage().subscribe(BusImage => {
        this.busImageO = BusImage.expand;
        this.busImageQuesO = BusImage.questions;
        console.log(this.busImageQuesO); //works fine here
    });

}

父模板

<business-image [busImageI]="busImageO" [busImageQuesI]="busImageQuesO"></business-image>

子组件

@Input('busImageI')
busImage: FirebaseObjectObservable<any>;

@Input('busImageQuesI')
questions: FirebaseObjectObservable<any>;

ngOnInit() {
    console.log(this.questions);// doesn't return anything
}

我什至回到父组件并像这样在它自己对数据库的调用中调用它

this._homeService.getBusImage().subscribe(BusImage => {
        this.busImageQuesO = BusImage.questions;
        console.log(this.busImageQuesO);
    });

它仍然没有对子组件产生影响。通过我一直在研究的其他元素,另一个和其他所有元素都显示得很好。

我在我遇到的一些文章和教程中看到他们强调在父组件中导入和声明子组件,但我看到其他一些他们只是在主组件中声明的文章和教程父组件链接到的模块,这就是我设置它的方式。我不知道这是否有所作为。我见过导入多个 @Inputs 的其他示例,但我看不出我在做什么不同。

【问题讨论】:

    标签: angular typescript angular2-inputs


    【解决方案1】:

    尝试将ngOnInit()更改为ngOnChanges()在子组件中,不要忘记通过导入OnChanges并实现它来进行相关的其他更改。更多信息请查看this

    【讨论】:

    • 好的,效果很好。但为什么?我还注意到,起初它仍然未定义,但随后该对象立即弹出。所以数据到达只是需要一段时间?
    • 发生这种情况是因为在您的服务 Observable 返回结果之前调用了孩子的 ngOnInit。这是 Observables 的主要思想,脚本执行在等待结果之前不会被阻塞。 IE。事件是这样的:父ngOnInit -> 子ngOnInit -> 服务返回结果-> 已分配给父变量-> 已分配给子变量
    • 我刚刚注意到这两个链接都指向 Angular.io 网站。
    • @DaMightyOptiq 是的,第一个告诉你 ngOnchanges 实际上是什么,第二个是关于所有 Angular 生命周期钩子之间的差异。实际上它们都在一页中,但这只是为了让您直截了当:)
    • 哦,好吧,只是确保这不是错误或什么,因为我阅读了第一个,然后单击第二个,例如“等等......这是同一页”哈哈。谢谢
    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 2020-12-09
    • 2019-12-09
    • 2019-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多