Skip to main content

Tracking models changes

What you'll learn
  • Tracking a model's instance changes
  • Creating snapshots of a model's instance
  • Restoring snapshots of a model's instance

Foscia will track changes over your instances properties (IDs, attributes or relations) throughout their existence.

Each time you send/fetch an instance to/from your data source, your instance's properties will be synced in an "original" snapshot.

This original snapshot allows you to check if some properties have changed since last synchronization.

Taking a snapshot

You can take a snapshot of an instance at any time using takeSnapshot. This is done automatically every time you send/fetch an instance to/form your data source, and the created snapshot is saved into the $original properties of your instance.

import { takeSnapshot } from '@foscia/core';

const myPostSnapshot = takeSnapshot(myPost);

Checking for changes

To check for changes between two snapshots, you can use compareSnapshots. To check for changes between an instance and its original snapshot, you can use changed (this will automatically take a new snapshot and compare against it).

import { changed, compareSnapshots, takeSnapshot } from '@foscia/core';

// True if any properties changed or instance does exists now.
changed(myPost);
// False in the same case as above.
compareSnapshots(takeSnapshot(myPost), myPost.$original);

// True only if title has changed.
changed(myPost, ['title']);
// False in the same case as above.
compareSnapshots(takeSnapshot(myPost), myPost.$original, ['title']);

Syncing changes

You can mark your instance as synced any time using markSynced. Just like other helper functions, you can affect only specific properties.

import { markSynced } from '@foscia/core';

// Mark all properties synced in $original snapshot.
markSynced(myPost);
// Mark the title synced on $original snapshot.
markSynced(myPost, ['title']);

Restoring changes

You can restore a snapshot on your model as synced any time using restore and restoreSnapshot. Just like other helper functions, you can affect only specific properties.

import { restore, restoreSnapshot } from '@foscia/core';

// Restore whole state.
restore(myPost);
// Equivalent with `restoreSnapshot`
restoreSnapshot(myPost, myPost.$original);
// Restore title property only.
restore(myPost, ['title']);
// Equivalent with `restoreSnapshot`
restoreSnapshot(myPost, myPost.$original, ['title']);