Что такое store.select в ngrx

Я новичок в Redux и начал с ngrx. Я не могу понять значение этой строки кода store.select:

 clock: Observable<Date>;
 this.clock = store.select('clock');

person blackHawk    schedule 12.08.2016    source источник


Ответы (4)


Проще говоря, select возвращает вам фрагмент данных из состояния приложения, завернутый в Observable.

Это означает, что оператор select получает необходимый фрагмент данных, а затем преобразует его в объект Observable. Итак, вы получаете обратно Observable, который упаковывает необходимые данные. Чтобы использовать данные, вам нужно подписаться на них.

Давайте посмотрим на очень простой пример.

  1. Определим модель нашего магазина

    export interface AppStore {
       clock: Date
    }
    
  2. Импортируйте Store в свой компонент из '@ngrx/store'

  3. Создайте хранилище, внедрив его в конструктор

    constructor(private _store: Store<AppStore>){}
    
  4. Select возвращает Observable.

    Итак, объявите переменную часов в вашем компоненте следующим образом:

    public clock: Observable<Date>;
    

    Теперь вы можете сделать что-то вроде следующего: -

    this.clock = this._store.select('clock');
    
person Mav55    schedule 31.05.2017
comment
Head Up для простого объяснения - person ismail baig; 28.02.2018
comment
я пробовал это, я получаю наблюдаемое, и если я его печатаю, я получаю › Store {_isScalar: false, actionObserver: ActionsSubject, reducerManager: ReducerManager, source: Store, operator: DistinctUntilChangedOperator} мои данные кажутся где-то внутри этого наблюдаемого, как мне получить от него? - person Koop4; 01.03.2018
comment
Вам нужно подписаться на наблюдаемую, а затем вы получите необходимые данные. - person Mav55; 01.03.2018
comment
Kloop4: если вы не знаете, что такое oberbable, вам нужно изучить RxJs. Пожалуйста, обратитесь к официальной странице здесь reactivex.io/rxjs/class/es6/ Observable.js~Observable.html - person Mav55; 01.03.2018
comment
@Koop4 вам нужно использовать асинхронный канал - person bertonc96; 08.07.2019
comment
bertonc96: асинхронный канал — это еще один способ подписки на наблюдаемое. Это зависит от того, в каком месте вам нужно подписаться. асинхронный канал используется в шаблоне html. - person Mav55; 12.07.2019

Вау, это большая тема. Таким образом, в основном «выбор» на самом деле является оператором RXJS, который используется в этом случае для извлечения значения части объекта состояния приложения. Итак, скажем, ваше основное состояние приложения имеет множество пользователей и множество функций безопасности. «Выбрать» позволяет вам получить ссылку на наблюдаемый объект, значением которого является именно этот массив пользователей. Прежде чем приступить к работе с ngrx, вам действительно нужно изучить Observables и RXJS. Я нашел эту статью, связанную с главной страницей проекта Github для ngrx, полезной.

https://gist.github.com/btroncone/a6e4347326749f938510

RXJS и редуксы могут быть большой темой, но я предлагаю работать над своими знаниями небольшими порциями. Мне потребовалось около 2 месяцев работы с ним, прежде чем я действительно начал чувствовать себя комфортно. Даже если вы не останетесь с ngrx, понимание того, как работает RXJS, невероятно полезно и стоит потраченного времени на его изучение.

Вот основная статья, которая также дает хорошее введение в RXJS. https://gist.github.com/staltz/868e7e9bc2a7b8c1f754

person wiredprogrammer    schedule 13.08.2016
comment
Не могли бы вы рассказать мне, как вам потребовалось 2 месяца, чтобы освоиться, я имею в виду, что каждому разработчику нужно такое время, вы новичок, кстати, хороший ответ - person blackHawk; 13.08.2016
comment
Также я в восторге от выбора, это похоже на оператор карты, принимает функцию и значение преобразования, верно? - person blackHawk; 13.08.2016
comment
У меня был проект, над которым я работал, мы переходили на Angular 2, и я решил попробовать ngrx. Я был новичком в ngrx, а также в rxjs. Я бы сказал, что потратил больше времени на изучение концепций rxjs и того, как работают наблюдаемые, чем ngrx. Большая часть того, на что мне потребовалось время, чтобы понять ngrx, заключалась в том, каковы лучшие соглашения по настройке редьюсеров и логики потока. Как настроить генераторы действий. Я черпал вдохновение для проекта, созданного из примера приложения, связанного с файлом readme проекта магазина ngrx. github.com/ngrx/example-app - person wiredprogrammer; 13.08.2016
comment
Чтобы понять, что происходит в примере приложения, потребовалось немного времени. Я также получил подписку на яйцеголового и смотрел редук-видео, сделанные создателем Дэном Абримовым. Прочитал популярные вопросы по проблемам проекта Redux. - person wiredprogrammer; 13.08.2016
comment
Я работаю программистом около 15 лет, но только последние 5 лет знакомлюсь с JavaScript и только последние 2-3 года начал изучать фреймворки. Я немного опоздал на фреймворк. - person wiredprogrammer; 13.08.2016
comment
Я думаю, что версия оператора select для хранилища немного более специализирована, но имеет ту же общую функцию, что и оператор rxjs. Судя по документации, select и map являются псевдонимами друг друга. reactivex.io/documentation/operators/map.html - person wiredprogrammer; 13.08.2016
comment
можем ли мы иметь несколько редукторов и хранилищ, что я понял до сих пор (1 день), что из компонента (для одного значения, такого как todo) у нас есть действие, которое будет отправлять полезную нагрузку редуктору, тогда у редуктора есть некоторая логика, основанная на типе (он имеет оператор возврата в каждом случае переключения, поэтому, когда он возвращается туда, куда он идет?), тогда у нас есть хранилище (я не знаю, где оно находится, оно импортировано из модуля узла), в хранилище будет некоторый предмет, который может отражать измененное значение обратно в компонент - person blackHawk; 13.08.2016
comment
так что мы можем иметь несколько хранилищ и редукторов, поэтому я понимаю, что у нас может быть несколько редукторов, а как насчет хранилища, кажется, что хранилища предназначены для одного значения, а для второго значения/свойства в компоненте нам понадобится другое хранилище, правильно ли это ? - person blackHawk; 13.08.2016
comment
ngrx и redux допускают только одно хранилище, так как это централизованное состояние. У вас может быть несколько редюсеров, которые работают с частями состояния. Итак, в моем предыдущем примере у вас был бы редьюсер для массива пользователей и другой редьюсер для массива функций безопасности. Оба действуют на центральное хранилище, но влияют только на часть хранилища. Все отправки выполняются на обоих редьюсерах, но когда отправка переходит к редьюсеру, который не заботится о действии, он должен возвращать состояние по умолчанию. Новые значения выдаются в хранилище только тогда, когда объекты в хранилище заменяются совершенно новыми объектами. - person wiredprogrammer; 13.08.2016
comment
Вы заметите, что в примерах они возвращают большую часть своих редукторов, используя Object.Assign, поэтому они могут создавать совершенно новый объект, но копировать большинство значений из исходного объекта состояния. - person wiredprogrammer; 13.08.2016
comment
Большая часть этого описана в сути, которую я опубликовал ранее, но что касается возврата. Хранилище ngrx создает объект, а затем создает свойства для этого объекта с теми же именами, что и объект редуктора, который вы передаете ему. Объект хранилища является наблюдаемым (я думаю). Когда редуктор запускается и возвращается значение, он присваивает это значение свойству созданного им объекта с тем же именем, что и редуктор. Это немного низкий уровень, но он может помочь вам понять, почему и как все работает. Я действительно предлагаю пройтись по этой сути. - person wiredprogrammer; 13.08.2016
comment
Хорошо, я расскажу, не могли бы вы объяснить мне, что здесь происходит github.com/blackhawk389/learn-angular2 проверить шаг 40 сохранить состояние в папке приложения - person blackHawk; 13.08.2016
comment
egghead.io/lessons/angular-2-ngrx-store- через 10 минут Это должно дать вам хороший базовый обзор. Я не собираюсь перечитывать основы в ветке комментариев. Извини. - person wiredprogrammer; 13.08.2016

Он возвращает состояние, называемое «часами».

Вот пример. В конструкторе вызывается store.select, на этот раз с todos.

https://github.com/btroncone/ngrx-examples/blob/master/todos/src/app/todo-app.ts

export class TodoApp {
    public todosModel$ : Observable<TodoModel>;
    //faking an id for demo purposes
    private id: number = 0;

    constructor(
        private _store : Store<AppState>
    ){
        const todos$ = _store.select<Observable<Todo[]>>('todos');
        const visibilityFilter$ = _store.select('visibilityFilter');

...

В начальной загрузке для ProvideStore задано значение APP_REDUCERS.

import {bootstrap} from '@angular/platform-browser-dynamic';
import {TodoApp} from './todo-app';
import {provideStore} from "@ngrx/store";
import * as APP_REDUCERS from "./reducers/reducers";


export function main() {
  return bootstrap(TodoApp, [
      provideStore(APP_REDUCERS)
  ])
  .catch(err => console.error(err));
}

APP_REDUCERS — это все определенные редукторы. Редуктор todos определяется следующим образом:

    import {ActionReducer, Action} from "@ngrx/store";
import {Todo} from "../common/interfaces";
import {ADD_TODO, REMOVE_TODO, TOGGLE_TODO} from "../common/actions";

export const todos : ActionReducer<Todo[]> = (state : Todo[] = [], action: Action) => {
  switch(action.type) {
      case ADD_TODO:
          return [
              ...state,
              action.payload
          ];

Есть несколько способов сделать это, и вы можете составить список всех ваших редьюсеров, по существу определив серию ключей объекта, которые ссылаются на объект редьюсера.

Store.select возвращает наблюдаемое, на которое вы можете подписаться либо в своем компоненте, либо в шаблоне через '|async'.

person Derek Kite    schedule 14.08.2016

This.store.select('keyname') вернет данные из объекта хранилища свойства 'keyname'. вы можете дополнительно искать внутренний объект в магазине, используя несколько редукторов с StoreModule.forFeature("master", masterReducer) в основном модуле с createSelector

export const getMasterState = createFeatureSelector<myModels.MasterState>('master');
export const getMatserBranchList = createSelector(
    getMasterState,
    (state: myModels.MasterState): myModels.Branch[] => state.branchList
);
person viveksharma    schedule 23.07.2018