NGXS: как передать всю коллекцию действиям в ngxs?

У меня есть коллекция объектов, которые мне нужно передать действиям ngxs. Я могу передать один объект, и он сохраняет состояние и работает нормально, но я не хочу повторять объект, вместо этого хочу передать всю коллекцию?

Я пробовал использовать один объект, он работает нормально, но хочу передать всю коллекцию?

Я пытаюсь вот так, но это не работает:

export class AddAccounts {
  static readonly type = '[Account] Add';
  constructor(public payload: Account[]) { }
}

//this.accounts is a collection of Account[] type.
this.store.dispatch(this.accounts); 

export class AccountStateModel {
  accounts: Account[][];
}

@State<AccountStateModel>({
  name: 'accounts',
  defaults: {
    accounts: []
  }
})

@Selector()
static getAccounts(state: AccountStateModel) {
  return state.accounts;
}

@Action(AddAccount)
add({ getState, patchState }: StateContext<AccountStateModel>, { payload }: 
  AddAccount) {
  const state = getState();
  patchState({
    accounts: [...state.accounts, payload]
  });
}

Есть ли способ передать всю коллекцию действиям?


person user2143953    schedule 23.05.2019    source источник
comment
Просто в вашем вызове к отправке вы не создаете тип действия ... это должно быть this.store.dispatch(new AddAccount(this.accounts));?   -  person Garth Mason    schedule 24.05.2019
comment
Спасибо, Гарт, при этом создается следующее состояние: следующее состояние {accounts: {…}} accounts: accounts: [Array (4)] proto: Object__proto__: Object, и я использую селектор как: @Select (AccountState.getAccounts) accounts $: Observable ‹Account []›; но я ничего не получаю в своем компоненте.   -  person user2143953    schedule 24.05.2019
comment
Я сделал stackblitz с вашим кодом, похоже, работает нормально - я вижу "учетные записи", появляющиеся в компоненте, см. stackblitz.com/edit/angular-3dheum   -  person Garth Mason    schedule 24.05.2019
comment
Гарт, я вижу в консоли, что я получаю массив в новом состоянии, но он находится внутри массива массива, но не отображается в пользовательском интерфейсе. @Select (AccountState.getAccounts) accounts $: Observable ‹Account []›; html: счета $ | async, console: next state {accounts: {…}} accounts: accounts: [Array (4)] __ proto__:   -  person user2143953    schedule 24.05.2019
comment
Может быть, какая-то проблема с вашим шаблоном, можете ли вы опубликовать stackblitz или более полный код в вопросе?   -  person Garth Mason    schedule 27.05.2019
comment
Гарт, stackblitz.com/edit/angular-jprbvq. Это фиктивный код, в котором я добавляю коллекцию из компонента создания и хочу, чтобы значение отображалось в компоненте чтения, которого нет.   -  person user2143953    schedule 27.05.2019
comment
Я ничего не вижу на этом блице, это просто стартовый шаблон ..   -  person Garth Mason    schedule 27.05.2019
comment
извиняюсь! Пожалуйста, попробуйте сейчас, может быть, я забыл сохранить   -  person user2143953    schedule 27.05.2019


Ответы (1)


Я думаю, это просто ошибка в вашей модели состояния. TutorialStateModel был определен как массив массивов (Tutorial[][]), а не как отдельный массив.

Когда я обновляю ваше определение и исправляю вызов patchState, чтобы он соответствовал ему, я вижу, как обновляется пользовательский интерфейс, как и ожидал. См. ниже:

введите здесь описание изображения

person Garth Mason    schedule 27.05.2019