peter4k / react-native-backbone

A react native version of backbone model
66 stars 18 forks source link

react-native-backbone

As react native does not support Node.js HTTP module, react-native-backbone helps you to connect to your REST api or localStorage much easier using the same concept of Backbone models and collections.

To do:

Table of content

Install

The easiest way to install: npm install react-native-backbone

And require it in your React Native app: var RNBackbone = require('react-native-backbone'); or ES6: import RNBackbone from 'react-native-backbone';

RNBackbone.Model

RNBackbone.Model is extended from backbone. The usages is almost the same as Backbone.Model, but some methods might be differnt.

Create a model class

var Car = RNBackbone.Model.extend({
    rootUrl: "http://www.your-domain.com/car"
    //More options to be added
});

rootUrl: the root url where this model connects to.

Create an instance

var bmw = new Car({
    "make": "BMW",
    "model": "428i",
    "year": 2014
})

You can create a model using the new keyword. You can pass an object as the initial value of the model, you can also create an empty model.

Model methods:

set():
bmw.set('mpg', '23')

this will set the atrribute mpg to 23.

You can also pass a json object as the argument:

bmw.set({
    "mpg": 23,
    "color": "white"
})
unset():
bmw.unset('mpg', '23')

The attribute "mpg" will be deleted

isNew():
bmw.isNew();

This will return ture if "id" attribute does not exist

save():
var option = {
    headers:{
        "Authentication":"Bearer SOME_TOKEN"
    }
}

bmw.save(option, function(error){
    if(error) console.log(error);
    console.log(people);
});

Save this model to the server, this is POST for new model and PUT for existing model

fetch():
bmw = new Car({
    id: 1
});

bmw.fetch(function(error){
    if(error) console.log(error);
    console.log(people);
});

Fetch this model from the server, this is GET request

delete():
bmw.delete(option, function(error){
    if(error) console.log(error);
});

Delete this model to the server, this is DELETE method

RNBackbone.Collection

There is only one sync method supported for collection: fetch

var Cars = RNBackbone.Colletion.extend({
    model: Car,
    url: 'https://YOUR_URL/cars
});
var cars = new Cars();
cars.fetch({
    success: ()=>{
        console.log(cars);
    }
})

Storage

As of react-native-backbone 0.1.0, we provides two different storage connectors.

fetchStorage

fetchStorage is the default storage connectors used by RNBackbone. It uses the built-in "fetch" method of React-Native

fetchStorage.globalOption.headers

If you want to send some headers in every request, you can set it up here.

import fetchStorage from 'react-native-backbone/src/storages/fetch'
fetchStorage.globalOption.headers:{
    "Authentiacation":"Bearer SOME_TOKEN"
}

fetchStorage.send()

Send simple HTTP request This is based on the React Native fetch method. It has a simple error checking to check if the response status is not between 200-208 or 226. The returned object is a json instead of a response object

//Set up request object
var request = {
    method: 'post',
    headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json'
    },
    body: JSON.stringify({
        "app":"FM Business",
        "platform":"iOS"
    })
}

var url = 'https://maps.googleapis.com/maps/api/geocode/json?address=1600+Amphitheatre+Parkway,+Mountain+View,+CA';

fetchStorage.send(url, request, function(error, json){
                if(error)
                    console.log("encountered error: ", error);
                console.log(json);
            });

request object: the same object used for fetch()

Realm

React Native's "asycnStorage" is a key-value pair storage, which is not ideal for the backbone concept. react native backbone uses a JavaScript library Realm for local storage

Setting up Realm

Now you can start using RNBackbone as normal

Realm Filter

If you are fetching a collection and you want to filter the objects, you can pass the filter option to the fetch method:


var Cars = RNBackbone.Colletion.extend({
    model: Car,
    url: 'https://YOUR_URL/cars
});
var cars = new Cars();
cars.fetch({
    filters: {
        make: 'bmw'
    },
    success: ()=>{
        console.log(cars);
    }
})