An adapter that replaces Backbone.sync
to save to Firebase Firestore
instead of using ajax.
Import backbone.firestore
and attach it to your models and collections:
const firebase = require("firebase");
require("firebase/firestore");
import {Collection, Model} from 'backbone';
import {FirestoreAdapter} from 'backbone.firestore';
firebase.initializeApp({
apiKey: '### FIREBASE API KEY ###',
authDomain: '### FIREBASE AUTH DOMAIN ###',
projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});
const SomeCollection = Collection.extend({
/**
* This collection will linked to Firestore collection which its name is
* 'SomeCollection' => firebase.firestore().collection('SomeCollection')
*/
firestore: new FirestoreAdapter('SomeCollection'),
});
const SomeModel = Model.extend({
/**
* A model can also has firestore property linked to
* Firestore collection 'SomeCollection'
*/
firestore: new FirestoreAdapter('SomeCollection')
});
To enable realtime update for subsequent changes, use subscriptionEnabled: true
in the fetch options
const myModel = new SomeModel({ id: 1234 });
//any changes in firestore doc of id 1234 will also synced to myModel
myModel.fetch({subscriptionEnabled: true});
const myCol = new SomeCollection();
//any changes in firestore collection will also synced to myCol
myCol.fetch({ subscriptionEnabled: true });
To unsubscribe from realtime update
import { FirestoreAdapter, unsubscribeUpdate } from 'backbone.firestore';
//myModel won't sync to firestore document changes
unsubscribeUpdate(myModel);
//myCol won't sync to firestore collection / queries changes
unsubscribeUpdate(myCol);
To perform firestore query
const myCol = new SomeCollection();
let options = {
//use firestoreQuery callback which its argument is CollectionReference and
//return the query
firestoreQuery = colRef => colRef.where('age', '<=', 50).orderBy('age')
}
myCol.fetch(options);
To synchronise with the normal REST api server that uses backbone collection url
property, you can pass the ajaxSync
flag to any options:
const myModel = new SomeModel();
myModel.fetch({
ajaxSync: true // Fetches from the server
});
myModel.save({
new: "value"
}, {
ajaxSync: true // Pushes back to the server
});
var bbFirestore = require('backbone.firestore');
var FirestoreAdapter = bbFirestore.FirestoreAdapter;
import {FirestoreAdapter} from 'backbone.firestore';
Install NodeJS and run yarn
or npm i
to get your dependencies, then:
- Open an issue identifying the fault
- Provide a fix, with tests demonstrating the issue
- Create
.env
in root project directory to provide the firebase firestore credentials. There is an example in.env.example
- Run
npm test
- Create a pull request
- Jerome Gravel-Niquet: This code is basically a port of his awesome Backbone.localStorage library