Как спроектировать хранилище (состояние приложения), чтобы мы могли менять данные в хранилище напрямую, без действий, редукторов? - PullRequest
0 голосов
/ 11 декабря 2018

Причина: Действие вводит огромный шаблон даже для простой операции.Это усложняет простой код.

Цель: Например,

interface Contact {
  name: string,
  id: string,
}
interface State {
  c1:Contact;
  c2:Contact;
}
let store: MyStore<State>;

store.operateOn(['c1'],(c:Contact)=>c.name='New name'); //['c1'] denotes path to contact

, поэтому после выполнения store.operateOn() произойдет реальное изменение состояния, и соответствующий абонент будет уведомлен.

Резюме: Существует ли какой-либо ngrx / store, такой как db, который позволяет нам изменять данные прямо / косвенно без каких-либо действий.

Ответы [ 3 ]

0 голосов
/ 10 марта 2019

Я создал библиотеку, чтобы сделать это.Он называется ng-app-state и является оберткой вокруг @ngrx/store.В вашем примере вы бы обновили хранилище с помощью следующей команды:

store('c1')('name').set('New name');

Он также предоставляет аналогичный интерфейс для наблюдения за изменениями в хранилище на любом уровне.Например, чтобы наблюдать за всеми изменениями c1, используйте

store('c1').$.subscribe(...);

. Для этого вы определяете службу MyStore следующим образом:

@Injectable()
export class MyStore extends AppStore<State> {
  constructor(store: Store<any>) {
    super(store, "myState", new State());
  }
}

Конечно, в вашем приложении есть небольшая настройкамодуль, а также.Узнайте больше на странице GitHub: https://github.com/simontonsoftware/ng-app-state

0 голосов
/ 11 марта 2019

Я написал библиотеку под названием ngx-RxCache.Взгляните на https://github.com/adriandavidbrand/ngx-rxcache.. Это поможет вам создать Angular сервисы для управления государством практически без всякого шаблона.

0 голосов
/ 11 декабря 2018

Вы могли бы перенаправить сервис Angular на с состоянием .Сохраняйте / кэшируйте все, что хотите, там;сливайте обновления как хотите.Совместное использование одного или нескольких экземпляров в приложении для координации состояния.Я использовал этот подход в успешных приложениях Angular.

В конкретном, но гибком примере вы могли бы имитировать (не Redux) подход React .Сохраняйте данные в виде JSON-подобного объекта, называемого «state», и отправляйте «setState» запросы на объединение изменений, возможно, используя преимущества оператора распространения.

@Injectable()
export class StateService {

  private state = {};

  constructor() {}

  public setState(changes: any): void {
    this.state = {
      ...this.state,
      ...changes,
    };
  }

  public getState(): any {
    return _.cloneDeep(this.state); // or Object.assign, or raw this.state
  }
}

Затем используйте это в любом месте вашего приложения.Если хотите, добавьте прослушиватели изменений.

Приложив немного больше усилий, вы могли бы реализовать интерфейс, который вы описали в вопросе, возможно, используя операции на основе пути lodash.Может быть, даже поделиться результатом в виде проекта с открытым исходным кодом.Такая вещь вполне может существовать;Я не уверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...