我是 NGXS 的新手。所以只是为了测试,我在简单的测试应用程序上尝试了简单的设置,您使用 导入应用程序组件中的状态forRoot
,一切正常。
现在我有一个稍微大一点的应用程序,我找到了forFeature
功能状态的功能。所以在我的模块中,我有以下代码:
imports: [...,
NgxsModule.forFeature([MyFeatureState]),
...]
然后我将模块延迟加载到每个功能的路由模块中,如下所示:
const routes: Routes = [
{
path: '',
component: AppComponent,
children: [
{path: '', redirectTo: 'my-feature', pathMatch: 'full'},
{path: 'my-feature', loadChildren: './my-feature/my-feature.module#MyFeatureModule'},
]
}
];
然后这是我的状态类:
export interface MyFeatureStateModel {
myFeatures: MyFeature[]
}
@State<MyFeatureStateModel>({
name: 'myFeatures',
defaults: {
myFeatures: []
}
})
@Injectable()
export class MyFeatureState {
constructor(private myFeatureService: MyFeatureService) {}
@Select()
static getAll(state: MyFeatureStateModel) {
return state.myFeatures;
}
}
我的显示组件上有以下选择:
@Select(MyFeatureState.getAll) myFeature$: Observable<any>;
选择状态上的数据时出现问题。你会注意到我现在已经使用了 any 因为我不知道这里真正返回了什么,但是当我订阅时,myFeature$
我可以看到数据并且它也被返回了,但不是只返回数据本身,而是返回像这样:
{myFeature: Array[]} // the array is the actual data
此外,当我打印以控制台状态快照时,我得到以下信息:
{
myFeature:
myFeature: []
}
所以当我订阅时会发生这样的额外步骤:
this.myFeature$.subscribe((data: any) => {
this.myFeature = data.myFeature;
// previously I only have to do this.myFeature = data
});
这一切都很好,除了以前我尝试过时forRoot
我不必这样做。
此外,当我使用forFeature
状态时的其他问题无法自动检测到商店已经有数据,因此即使商店中已经有数据,它也会继续查询后端。我不得不添加一个我认为不理想的 if 语句。同样在我使用它之前,forRoot
它可以自动检测,因此应用程序只查询一次后端,并且只在页面加载时查询。
知道为什么会发生这些吗?