Store
Angular Three NgtCanvas
starts with a default NgtSignalStore<NgtState>
that is used to keep track of
the state of the canvas like the Renderer, Camera, Scene, Controls, events, size, etc…
We can access this store via the injectStore
function
Reactive State
The store exposes its properties as Signal
via the select()
function. select()
creates a computed
Signal
under the hood and caches the created Signal.
export class Experience { private store = injectStore(); camera = this.store.select('camera'); // Signal<NgtCamera> gl = this.store.select('gl'); // Signal<WebGLRenderer>}
We can access nested properties of the store by passing more arguments to select()
export class Experience { private store = injectStore(); domElement = this.store.select('gl', 'domElement'); // Signal<HTMLCanvasElement> width = this.store.select('size', 'width'); // Signal<number> height = this.store.select('size', 'height'); // Signal<number>}
To access the entire store, we can use select()
without any arguments or use state
property.
export class Experience { private store = injectStore(); state = this.store.state; // Signal<NgtState>;}
Snapshot State
We can access the latest state of the store via the snapshot
property. snapshot
always returns the latest state
upon accessing.
export class Experience { private store = injectStore();
constructor() { afterNextRender(() => { const { gl, camera, size, /* ... */ } = this.store.snapshot; }) }}
This is useful when we want to access the latest state imperatively without reactivity. Most of the time, this is used in the animation loop.
get()
Alternatively, we can access the snapshot properties as values via get()
.
export class Experience { private store = injectStore(); camera = this.store.get('camera'); // NgtCamera gl = this.store.get('gl'); // WebGLRenderer}
We can access nested properties of the store by passing more arguments to get()
export class Experience { private store = injectStore(); domElement = this.store.get('gl', 'domElement'); // HTMLCanvasElement width = this.store.get('size', 'width'); // number height = this.store.get('size', 'height'); // number}