我正在開發Angular 2應用程序,其中模塊內有兩個組件。兩個模塊都是獨立的,沒有父子關係。第一個組件收集用戶需要傳遞給第二個組件的一些數據。Angular 2中的同級組件之間的數據共享
成分I:
@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
})
}
}
組分II:
@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
只是一個模型類,它有許多與用戶實例相對應的字段。
用戶類
export class User {
phone: string;
otp: string;
reference_id: string;
// Many other similar fields
}
UserService
@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]
服務。如果我在兩個組件的級別註冊,都會發生同樣的問題。什麼是問題?
似乎像UserService正在實例化兩次;每個組件一次。我需要它僅實例化一次,以便可以在組件之間共享數據。 – Aosis
請發佈'user.module'和你的'app.module'。另外,向服務添加一個構造函數,並在其中添加一條日誌語句以確保它已被多次實例化。 –
我通過https://embed.plnkr.co/FQGDe1gbSI5speWFLDLl/創建了一個plnkr。這是工作,但相同的代碼不能在我的本地機器上工作。我使用了Angular quickstart種子(https://github.com/angular/quickstart)並添加了我的代碼。它不工作。然而,有趣的是,如果我使用Angular CLI並添加我的代碼,它將再次正常工作。有什麼理由? – Aosis