请注意::我知道这里有
APP_INITIALIZER
,但这似乎仅适用于该产品的顶级模块( app.module.ts )应用。
我有一个加载某些数据的父组件:
在 admin-area.component.ts 中:
ngOnInit(): void {
forkJoin([
this._userService.getMe(),
this._placeService.getAll()
])
.pipe(finalize(() => this.afterInit()))
.subscribe(
([user, businesses]) => {
this._appState.user = user;
this._appState.businesses = businesses;
this.afterInit();
}
);
}
问题在于存在依赖this._appState.user
和this._appState.businesses
的子组件。
我无法用APP_INITIALIZER
加载它,因为只有在用户登录后才加载上述数据。“ login-in”区域本身就是一个延迟加载的模块。
所以,问题很简单:
在子组件尝试显示自身之前,如何确保已加载数据?
此:
providers: [
AdminAreaState,
{ provide: APP_INITIALIZER, useFactory: adminAreaInit, deps: [AdminAreaState], multi: true}
]
不起作用。 adminAreaInit()
没有被呼叫。这仅适用于我的顶级模块 app.module.ts 。因此,APP_INITIALIZER
似乎无法在任何其他模块上使用,是正确的吗?
我在这里有什么选择?
我认为我需要提供更多详细信息。
请注意,我已经在尝试使用*ngIf
:
<div *ngIf="!business?.servicePlan">
Please Upgrade
</div>
但是问题是,如果我导航到该特定页面并刷新该页面,则business
始终为undefined
。 business
是使用business
在businesses
数组中找到正确的businessId
的结果。
在加载子组件时,我将加载其他数据。在这种情况下,有一些评论(评论)。
现在,loadPage()
加载了我的业务所需数据的一个页面。 _appState
是应该首先加载的服务。如果我这样做:
private loadPage() {
console.log(this._appState);
console.log(this._appState.businesses);
this._appState.businesses.forEach(
(b) => {
console.log(b);
});
setTimeout(() => this._appState.businesses.forEach(
(b) => {
console.log(b);
}
), 100);
const businessId = this._appState.businessId;
this.business = this._appState.businesses.find(b => b.id === businessId);
}
这就是我得到的:
您可以看到this._appState
有个企业,但是this._appState.businesses
确实打印了一个空数组。
_appState.businesses
仅仅是Observable
:
ApplicationState
服务:
@Injectable()
export class ApplicationState {
public businessIdChange;
public businessesChange;
private _user = new BehaviorSubject<UserModel>(null);
private _businessId = new BehaviorSubject<number>(null);
private _businesses = new BehaviorSubject<Array<BusinessModel>>([]);
constructor() {
this.businessIdChange = this._businessId.asObservable();
this.businessesChange = this._businesses.asObservable();
}
set user(value: UserModel) {
this._user.next(value);
}
get user(): UserModel {
return this._user.getValue();
}
set businessId(businessId: number) {
if (businessId === this.businessId) {
return;
}
this._businessId.next(businessId);
}
get businessId() {
return this._businessId.getValue();
}
set businesses(value) {
this._businesses.next(value);
}
get businesses(): Array<BusinessModel> {
return this._businesses.getValue();
}
}
我不知道为什么会看到这个,我认为预加载数据还是有道理的。但也许我在这里有其他问题?