Skip to main content

Select State

Reactive Select

todo-feature-store.ts
import { Observable } from 'rxjs';

todos$: Observable<Todo[]> = this.select(state => state.todos);

select takes a callback function which gives you access to the current feature state (see the state parameter). Within that function you can pick a specific piece of state. select returns an Observable which will emit as soon as the selected state changes.

Memoized Selectors

You can use memoized selectors also with the Feature Store... You only have to omit the feature key when using createFeatureStateSelector. This is because the Feature Store is operating on a specific feature state already (the corresponding feature key has been provided in the constructor).

todo-feature-store.ts
import { createFeatureStateSelector, createSelector } from 'mini-rx-store';

// Memoized Selectors
const getTodoFeatureState = createFeatureStateSelector<TodoState>(); // Omit the feature key!

const getTodos = createSelector(
getTodoFeatureState,
state => state.todos
);

const getSelectedTodoId = createSelector(
getTodoFeatureState,
state => state.selectedTodoId
)

const getSelectedTodo = createSelector(
getTodos,
getSelectedTodoId,
(todos, id) => todos.find(item => item.id === id)
)

class TodoFeatureStore extends FeatureStore<TodoState> {

// State Observables
todoState$: Observable<TodoState> = this.select(getTodoFeatureState);
todos$: Observable<Todo[]> = this.select(getTodos);
selectedTodo$: Observable<Todo> = this.select(getSelectedTodo);

constructor() {
super('todoFs', initialState) // Feature key 'todosFs' is provided here already...
}

addTodo(todo: Todo) {
this.setState(state => ({
todos: [...state.todos, todo]
}))
}

selectTodo(id: number) {
this.setState({selectedTodoId: id});
}
}