【发布时间】:2019-07-16 04:43:01
【问题描述】:
现场演示https://stackblitz.com/edit/angular-vw78jf
在我的 ngxs 状态中有 ToppingsStateModel
export interface ToppingsStateModel {
entities: { [ id: number ]: Topping };
selectedToppings: number[];
}
一个操作更改了我的实体列表,另一个操作更改了 selectedToppings。 在 products.component 我从选择器中获取浇头列表
export class ToppingsState {
constructor(private toppingsService: ToppingsService) {
}
@Selector()
static entities(state: ToppingsStateModel) {
console.log('getEntities', state.entities);
return state.entities;
}
@Selector([ToppingsState.entities])
static toppings(state: ToppingsStateModel, entities: {[id: number]: Topping}): Topping[] {
return Object.keys(entities).map(id => entities[parseInt(id, 10)]);
}
...
}
它是product.component
export class ProductsComponent implements OnInit {
@Select(ToppingsState.toppings) toppings$: Observable<Topping[]>;
constructor(private store: Store, private actions$: Actions) {}
ngOnInit() {
const state = this.store.dispatch(new LoadToppings());
setTimeout(() => this.store.dispatch(new VisualizeToppings([1])), 2000);
this.toppings$.subscribe((toppings) => {console.log('UUUU NEW TOPPINGS!!!')});
}
}
当我调度 VisualizeToppings 操作时,我会得到新的 toppings 值。在我的控制台中,我有
action [Products] Load Toppings @ 10:57:59.735
getEntities {}
UUUU NEW TOPPINGS!!!
getEntities {1: {…}, 2: {…}}
UUUU NEW TOPPINGS!!!
action [Products] Visualize Toppings @ 10:58:01.744
getEntities {1: {…}, 2: {…}}
UUUU NEW TOPPINGS!!!
我改变了状态的另一部分。当我调度 VisualizeToppings 操作时,为什么选择器会再次执行?我做错了什么?
【问题讨论】:
-
从内存中我认为自定义选择器在每次状态更改时都会执行 - 在文档中找不到这个,但我可能已经在 NGXS github 或 slack 频道中阅读过它。我认为你没有做任何“错误”导致这种情况发生。
-
出于兴趣而不是静态选择器,如果您直接订阅会发生什么?例如@Select(state => state.toppings.entities) toppings$ ..
-
直接订阅有效 O_o 但我认为这是解决问题的坏方法。附:在 NGRX 中一切正常,当我使用 createSelector
标签: ngxs