@InjectStore decorator
@InjectStore decorator is responsible for injecting store and state variables into actions class
First parameter is Path to state
if added between single quotes '' it counts as absolute path
@InjectStore('todos/items/1')
if added in array [], final path will be merged with path passed from parent. e.g: if parent component path is
todos
and child component path isfilter
so marking child component with@InjectStore(['filter'])
will result path like['todos', 'filter']
. Do not forget to pass parent path from parent to child by adding to child component markup<todos-filter [statePath]="statePath"></todos-filter>
if state is part of the list,
stateIndex
param should be passed from the parent component and new path will look like:['items', '${stateIndex}'] -> ['todos', 'items', '0]
stateIndex
can be an array of indexes so state path can have multiple${stateIndex}
:@InjectSore(['${stateIndex}', 'some_other_path', '${stateIndex}'])
there can be use-cases when actions can be shared because of identical states keeping in different locations. In this case there can be anonymous function passed as a first parameter:
@InjectStore((currentPath: string[]) => {
return currentPath.indexOf('search') >= 0
? ['entities', '${stateIndex}']
: ['${stateIndex}'];
})
Second Parameter: initialState
initialState
You can provide an initial state object as the second parameter. This is useful when the state slice requires default values:
@InjectStore('todos/sports-todos', {
name: '',
description: ''
})
export class TodosActions {
store!: Store<TodosState>;
}
Note: Often in larger applications, you cannot define all pieces of state upfront. Many pieces should be created "on the fly". For this scenario, you can provide a function or object that returns the initial state.
Initial State as a Function
Instead of a static object, you can pass a function as the initial state. The function is executed each time the store is created, allowing dynamic or context-aware defaults:
@InjectStore('todos/sports-todos', () => ({
name: '',
description: '',
createdAt: new Date() // dynamic initial value
}))
export class TodosActions {
store!: Store<TodosState>;
}
This is particularly useful when:
The initial state depends on runtime values (like the current date, user info, or configuration).
You need fresh instances of objects or arrays to avoid shared references.
Third Parameter: Debug Mode
Optionally, you can enable debug mode by passing a boolean as the third parameter:
@InjectStore('todos/sports-todos', { name: '', description: '' }, true)
export class TodosActions {
store!: Store<TodosState>;
}
debug = true
→ Logs warnings for missing state paths.debug = false
→ Silently ignores path checks (default behavior).
Example: Dynamic State Creation
@InjectStore(
(currentPath, stateIndex) => `users/${stateIndex}/profile`,
() => ({
firstName: '',
lastName: '',
lastLogin: new Date()
})
)
export class UserProfileActions {
store!: Store<UserProfileState>;
}
Here, the store path is dynamically computed based on the stateIndex
, and the initial state is generated at runtime.
Last updated
Was this helpful?