Angular 2 中兄弟组件之间的数据共享
Data sharing between sibling components in Angular 2
我正在开发 Angular 2 应用程序,其中我在一个模块中有两个组件。两个模块都是独立的,没有父子关系。第一个组件从用户那里收集一些数据,这些数据需要传递给第二个组件。
组件一:
@Component({
selector: 'user-otp-generation',
templateUrl: `../partials/user-management/user-generate-otp.html`,
moduleId: module.id,
// providers: [UserService]
})
export class UserOtpGenerationComponent{
constructor(private UserService: UserService) { }
user: User = new User();
onSubmit(){
this.UserService.generateOTP(this.user.phone)
.then(response => {
this.UserService.setUserProperty('phone', this.user.phone); //From user input
this.UserService.setUserProperty('otp', response.otp); //From API response
})
}
}
组件二:
@Component({
selector: 'user-authentication',
templateUrl: `../partials/user-management/user-authentication.html`,
moduleId: module.id,
// providers: [UserService]
})
export class UserAuthenticationComponent {
constructor(private UserService: UserService) {
this.user = UserService.getUser();
}
user:User;
onSubmit(){
this.UserService.verifyOTP(this.user.otp)
.then(response => { //Do something })
}
}
由于两个组件都处于兄弟级别,我认为使用数据共享服务是一个很好的方法。所以,我创建了数据服务 UserService
。此外,User
只是一个模型 class,它有许多对应于用户实例的字段。
用户class
export class User {
phone: string;
otp: string;
reference_id: string;
// Many other similar fields
}
用户服务
@Injectable()
export class UserService {
private user: User = new User();
getUser(){
return this.user;
}
setUserProperty(key, value){
this.user[key] = value;
}
generateOTP(phone: string): Promise<any>{
return this.http.get('some-url').toPromise();
}
}
没有父组件。这些组件位于具有如下路由的用户模块内:
const userRoutes: Routes = [
{path: '', redirectTo: 'generate-otp', pathMatch: 'full'},
{path: 'generate-otp', component: UserOtpGenerationComponent},
{path: 'authenticate', component: UserAuthenticationComponent}
]
我在服务级别添加了 user
属性。在组件 I 中,我创建了一个 user
属性 其值最终用于修改服务 user
属性 以便它可以在组件 II 中访问。在组件 II 实例化期间,我使用服务用户 属性 初始化其用户 属性。但是,这次我作为用户得到了空对象。
我已经在 user.module 的 NgModule 中将服务注册为 providers: [UserService]
。如果我在两个组件级别注册它,也会出现同样的问题。有什么问题?
我找不到这个问题的正确答案。但是,从上面的评论可以明显看出,当我在 plunker 中尝试或使用 Angular CLI 1.0.2 时,代码工作正常。早些时候,我使用的是快速启动种子。
正如@Ahmed Musallam 所建议的,我在服务中使用了 console.log 语句,当然,服务被实例化了两次。
我现在正在使用 angular-cli
。这是我唯一能想到的解决方案。
我正在开发 Angular 2 应用程序,其中我在一个模块中有两个组件。两个模块都是独立的,没有父子关系。第一个组件从用户那里收集一些数据,这些数据需要传递给第二个组件。
组件一:
@Component({
selector: 'user-otp-generation',
templateUrl: `../partials/user-management/user-generate-otp.html`,
moduleId: module.id,
// providers: [UserService]
})
export class UserOtpGenerationComponent{
constructor(private UserService: UserService) { }
user: User = new User();
onSubmit(){
this.UserService.generateOTP(this.user.phone)
.then(response => {
this.UserService.setUserProperty('phone', this.user.phone); //From user input
this.UserService.setUserProperty('otp', response.otp); //From API response
})
}
}
组件二:
@Component({
selector: 'user-authentication',
templateUrl: `../partials/user-management/user-authentication.html`,
moduleId: module.id,
// providers: [UserService]
})
export class UserAuthenticationComponent {
constructor(private UserService: UserService) {
this.user = UserService.getUser();
}
user:User;
onSubmit(){
this.UserService.verifyOTP(this.user.otp)
.then(response => { //Do something })
}
}
由于两个组件都处于兄弟级别,我认为使用数据共享服务是一个很好的方法。所以,我创建了数据服务 UserService
。此外,User
只是一个模型 class,它有许多对应于用户实例的字段。
用户class
export class User {
phone: string;
otp: string;
reference_id: string;
// Many other similar fields
}
用户服务
@Injectable()
export class UserService {
private user: User = new User();
getUser(){
return this.user;
}
setUserProperty(key, value){
this.user[key] = value;
}
generateOTP(phone: string): Promise<any>{
return this.http.get('some-url').toPromise();
}
}
没有父组件。这些组件位于具有如下路由的用户模块内:
const userRoutes: Routes = [
{path: '', redirectTo: 'generate-otp', pathMatch: 'full'},
{path: 'generate-otp', component: UserOtpGenerationComponent},
{path: 'authenticate', component: UserAuthenticationComponent}
]
我在服务级别添加了 user
属性。在组件 I 中,我创建了一个 user
属性 其值最终用于修改服务 user
属性 以便它可以在组件 II 中访问。在组件 II 实例化期间,我使用服务用户 属性 初始化其用户 属性。但是,这次我作为用户得到了空对象。
我已经在 user.module 的 NgModule 中将服务注册为 providers: [UserService]
。如果我在两个组件级别注册它,也会出现同样的问题。有什么问题?
我找不到这个问题的正确答案。但是,从上面的评论可以明显看出,当我在 plunker 中尝试或使用 Angular CLI 1.0.2 时,代码工作正常。早些时候,我使用的是快速启动种子。
正如@Ahmed Musallam 所建议的,我在服务中使用了 console.log 语句,当然,服务被实例化了两次。
我现在正在使用 angular-cli
。这是我唯一能想到的解决方案。