Accessing a property in a parent Component in Angular2 with TypeScript
在过去4年里,我一直在和Angular1*一起愉快地工作,现在我正在努力自学Angular2和打字。无论如何,我在一个顶级组件中有一个属性,它是来自这样一个HTTP源的用户数据…(这是一个名为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | import {UserData} from './services/user-data/UserData'; Component({ selector: 'app', // </app> providers: [...FORM_PROVIDERS], directives: [...ROUTER_DIRECTIVES], pipes: [], template: require('./app.html') }) @RouteConfig([ // stuff here ]) export class App { // Please note that UserData is an Injectable Service I have written userStatus: UserStatus; constructor(private userData: UserData) { this.userStatus = new UserStatus(); } ngOnInit() { this.userData.getUserStatus() .subscribe( (status) => { this.userStatus = status; // I want to access this in my Child Components... }, (err) => {console.log(err);}, () => {console.log("User status complete"); } ); } } |
现在我有了另一个组件,它是顶级组件的直接子组件,在其中我想访问父组件的属性"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | Component({ selector: 'profile', template: require('app/components/profile/profile.html'), providers: [], directives: [], pipes: [] }) export class Profile implements OnInit { constructor() { } ngOnInit() { // I want to have access with the parent App Component, 'userStatus' propety here... I only want to read this property } } |
现在在angular1.x中,这很容易,因为我可以在我的孩子控制器或(反模式警报)中引用
有不同的方法:
全球服务
- 也见
- https://github.com/escardin/angular2 community faq/blob/master/services.md how-do-i-communication-between-components-using-a-shared-service
- 角度2中的全局事件
- 柱塞
由父级共享并注入子级的服务
- 与Global Service类似,但列在
providers 或viewProviders 中的是父级,而不是boostrap(...) 中的,并且仅对父级的子级可用。
- 与Global Service类似,但列在
父对象被注入子对象并由子对象直接访问
- 缺点:耦合紧密
1 2 3 4 | export class Profile implements OnInit { constructor(@Host() parent: App) { parent.userStatus ... } |
- 数据绑定
1 2 3 4 5 6 | export class Profile implements OnInit { @Input() userStatus:UserStatus; ... } <profile [userStatus]="userStatus"> |
我也有同样的问题,但我用不同的方法解决了它。我不知道这是不是一个好的方法,但它很适合我需要的。
我在子组件的构造函数上使用了@inject,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 | import { Component, OnInit, Inject } from '@angular/core'; import { ParentComponent } from '../views/parent/parent.component'; export class ChildComponent{ constructor(@Inject(ParentComponent) private parent: ParentComponent){ } someMethod(){ this.parent.aPublicProperty = 2; } } |
这对我很有效,您只需要将要调用的方法或属性声明为public。
在我的例子中,AppComponent处理路由,我使用菜单项中的徽章来提醒用户有新的未读消息可用。所以每当用户读到一条消息,我都希望计数器刷新,所以我调用刷新方法,这样菜单导航中的数字就会更新为新的值。这可能不是最好的方法,但我喜欢它的简单。
你可以:
为子组件定义一个
userStatus 参数,并在从父组件使用此组件时提供该值:1
2
3
4
5
6
7
8
9@Component({
(...)
})
export class Profile implements OnInit {
@Input()
userStatus:UserStatus;
(...)
}在父母身上:
1<profile [userStatus]="userStatus"></profile>将父组件插入子组件:
1
2
3
4
5
6
7
8
9
10@Component({
(...)
})
export class Profile implements OnInit {
constructor(app:App) {
this.userStatus = app.userStatus;
}
(...)
}注意它们之间的循环依赖关系。
我制作了一个通用组件,需要使用它引用父组件。我想到的是:
在我的组件中,我做了一个@输入:
1 2 | @Input() parent: any; |
然后在使用此组件的父级中:
1 | </app-super-component> |
在超级组件中,我可以使用来自父组件的任何组件:
属性:
1 | parent.anyAttribute |
功能:
1 | parent[myFunction](anyParameter) |
在Angular6上,我通过构造函数注入父属性来访问父属性。不是最好的解决方案,但它有效:
1 2 3 4 | constructor(@Optional() public parentComponentInjectionObject: ParentComponent){ // And access like this: parentComponentInjectionObject.thePropertyYouWantToAccess; } |