Angular 6 - 一些组件使用仅调用一次的相同随机数据 - 如何避免 'undefined'
Angular 6 - a few components using the same randomised data that's called only once - how to avoid 'undefined'
我试图在多个组件的 ngOnInit
中使用相同的数据,问题是,每次订阅时数据都是随机的。我只能在整个 运行 应用程序中订阅一次。这意味着,如果我订阅两次,它不会有任何用处,因为每个组件都会有其他东西。
我想订阅一次服务并创建一个全局变量。
但是当您尝试在所有组件中使用该全局变量时(在 ngOnInit
上),它始终是未定义的。
如何让组件等待在应用程序中只能调用一次的同一事件?
export class UsersService {
public allUsers: Array<Object> = []
public allUsersUrl: string = 'https://glacial-escarpment-40412.herokuapp.com/users/'
constructor(private http: HttpClient) {
this.getAllUsers().subscribe(data => {
this.allUsers = data;
console.log(this.allUsers)
})
}
getAllUsers(): Observable<any> {
return this.http.get<any>(this.allUsersUrl);
}
getUser(id: number): Observable<any> {
return this.http.get<any>(this.allUsersUrl + id);
}
}
我的组件:
export class FirstComponent {
constructor(private usersService: UsersService){}
ngOnInit() {
console.log(this.usersService.allUsers) //undefined
}
export class SecondComponent {
constructor(private usersService: UsersService){}
ngOnInit() {
console.log(this.usersService.allUsers) //undefined
}
请帮帮我:)
您遇到同步问题。这是你的场景
1- 创建 first component
1.1 - 注入 UsersService
1.2 - UsersService
请求异步数据(执行继续)
2- FirstComponent 获取并打印 this.usersService.allUsers
(由于异步请求,仍未填充)
3- this.usersService.allUsers
仍未定义
你需要Subject
像这样:
用户服务
export class UsersService {
private _allUsersSource = new Subject<Array<Object>>();
private _allUsers$ = this._allUsersSource.asObservable();
public allUsersUrl: string = 'https://glacial-escarpment-40412.herokuapp.com/users/'
constructor(private http: HttpClient) {
this.getAllUsers();
}
getAllUsers(): Observable<any> {
return this.http.get<any>(this.allUsersUrl).subscribe(
data => this._allUsersSource.next(data)
);
}
get allUsers$(): Observable<Array<Object>> {
return this._allUsers$;
}
// OTHERS
}
第一个组件
export class FirstComponent {
subscription: Subscription;
allUsers: Array<Object>;
constructor(private usersService: UsersService){}
ngOnInit() {
this.subscription = this.usersService.allUsers$.subscribe(users => {
this.allUsers = users;
console.log(this.allUsers);
});
}
SecondComponent
的一些东西
我试图在多个组件的 ngOnInit
中使用相同的数据,问题是,每次订阅时数据都是随机的。我只能在整个 运行 应用程序中订阅一次。这意味着,如果我订阅两次,它不会有任何用处,因为每个组件都会有其他东西。
我想订阅一次服务并创建一个全局变量。
但是当您尝试在所有组件中使用该全局变量时(在 ngOnInit
上),它始终是未定义的。
如何让组件等待在应用程序中只能调用一次的同一事件?
export class UsersService {
public allUsers: Array<Object> = []
public allUsersUrl: string = 'https://glacial-escarpment-40412.herokuapp.com/users/'
constructor(private http: HttpClient) {
this.getAllUsers().subscribe(data => {
this.allUsers = data;
console.log(this.allUsers)
})
}
getAllUsers(): Observable<any> {
return this.http.get<any>(this.allUsersUrl);
}
getUser(id: number): Observable<any> {
return this.http.get<any>(this.allUsersUrl + id);
}
}
我的组件:
export class FirstComponent {
constructor(private usersService: UsersService){}
ngOnInit() {
console.log(this.usersService.allUsers) //undefined
}
export class SecondComponent {
constructor(private usersService: UsersService){}
ngOnInit() {
console.log(this.usersService.allUsers) //undefined
}
请帮帮我:)
您遇到同步问题。这是你的场景
1- 创建 first component
1.1 - 注入 UsersService
1.2 - UsersService
请求异步数据(执行继续)
2- FirstComponent 获取并打印 this.usersService.allUsers
(由于异步请求,仍未填充)
3- this.usersService.allUsers
仍未定义
你需要Subject 像这样:
用户服务
export class UsersService {
private _allUsersSource = new Subject<Array<Object>>();
private _allUsers$ = this._allUsersSource.asObservable();
public allUsersUrl: string = 'https://glacial-escarpment-40412.herokuapp.com/users/'
constructor(private http: HttpClient) {
this.getAllUsers();
}
getAllUsers(): Observable<any> {
return this.http.get<any>(this.allUsersUrl).subscribe(
data => this._allUsersSource.next(data)
);
}
get allUsers$(): Observable<Array<Object>> {
return this._allUsers$;
}
// OTHERS
}
第一个组件
export class FirstComponent {
subscription: Subscription;
allUsers: Array<Object>;
constructor(private usersService: UsersService){}
ngOnInit() {
this.subscription = this.usersService.allUsers$.subscribe(users => {
this.allUsers = users;
console.log(this.allUsers);
});
}
SecondComponent