0

这是我第一次使用 ngRx Store,我实现了我的第一个效果..

什么工作正常:

  • 与后端通信
  • 正在后端执行操作(删除、添加、获取)
  • 有效载荷从效果到达减速器(记录下来以确保)

所以我的问题是我无法从减速器中获取数据。如果我从组件中的存储中选择数据,则会在组件中获得未定义的数据。我点击了效果中的数据,数据被明确传递了。还将数据记录在减速器中 - 它就在那里。但是当它返回时,它返回未定义。ReDux Devtools 记录一切正常。最后但并非最不重要的一点.. 即使使用固定值,状态也不会更新,例如用于加载的 true/false 布尔值。

乐代码:

// 我得到未定义的地方

export class ProfileComponent implements OnInit {

  user: any;
  items$: Observable<Product[]>;
  loading$: Observable<boolean>;
  error$: Observable<Error>;
  newItem: Product = {id: 0, name:""};

  constructor(private keycloakService: KeycloakService, private store: Store<ProductState>, private productService: ProductService) { }

  ngOnInit(): void {
    this.productService.setToken(this.keycloakService.getToken());

    this.user = this.keycloakService.getUsername();

    this.items$ = this.store.select(store => store.list);
    this.loading$ = this.store.select( store => store.loading);
    this.error$ = this.store.select( store => store.error);

    this.store.dispatch(new LoadProduct());

    this.items$.subscribe(val => console.log(val));
    this.loading$.subscribe(val => console.log(val));
    this.error$.subscribe(val => console.log(val));
  }

// 减速器

export type Action = Products.All;

const initialState: ProductState = {
  list: [],
  loading: false,
  error: undefined
}

const newState = (state, newData) => {
  return Object.assign({}, state, newData);
}

export function reducer(state: ProductState = initialState, action: Action) : ProductState{
  console.log(action.type, state);

  switch (action.type) {
    case Products.LOAD_PRODUCT: return { ...state, loading: true};
    case Products.LOAD_PRODUCT_SUCCESS: return newState(state, {list: action.payload, loading: false, error: undefined});
    case Products.LOAD_PRODUCT_FAILURE: return { ...state, error: action.payload, loading: false};
    case Products.ADD_PRODUCT: return { ...state, loading: true};
    case Products.ADD_PRODUCT_SUCCESS: return { ...state, list: action.payload, loading: false};
    case Products.ADD_PRODUCT_FAILURE: return { ...state, error: action.payload, loading: false};
    case Products.REMOVE_PRODUCT: return { ...state, loading: true};
    case Products.REMOVE_PRODUCT_SUCCESS: return { ...state, list: state.list.filter(item => item.id !== action.payload), loading: false};
    case Products.REMOVE_PRODUCT_FAILURE: return { ...state, error: action.payload, loading: false};
    default: return state;
  }

我非常感谢你的帮助:)

4

1 回答 1

0

您应该使用选择器函数从商店获取数据:https ://ngrx.io/guide/store/selectors

为了快速解除封锁,我敢打赌.list, .loading, .errorstate.

试试这个来调试:

// see how the whole store looks like
this.store.subscribe(state => console.log({ state }));

对你来说,我看到它与 相关products,所以我敢打赌它应该是这样的:

this.items$ = this.store.select(store => store.products.list);
this.loading$ = this.store.select( store => store.products.loading);
this.error$ = this.store.select( store => store.products.error);
于 2021-05-19T14:10:40.067 回答