bfanger / angular-activerecord

A model layer for AngularJS inspired by Backbone.Model
MIT License
137 stars 28 forks source link

ActiveRecord for AngularJS

angular-activerecord is a Backbone.Model inspired modellayer for AngularJS.

Build Status

API Documentation

Differences compared to Backbone.Model

Goals / Features (compared to ngResource)

Examples

Defining a model

 module('myApp', ['ActiveRecord']); // Add "ActiveRecord" as module dependency.

 module('myApp').factory('Task', function (ActiveRecord) {

    return ActiveRecord.extend({

        // Rest API configuration for retrieving and saving tasks.
        $urlRoot: '/api/tasks',

        // Optional defaults
        $defaults: {
            title: 'Untitled',
            estimate: ''
        },

        // optional named constructor (Shows "Task" as the type in a console.log)
        $constructor: function Task(properties) {
            this.$initialize.apply(this, arguments)
        },

        // An example method for task instances
        /**
         * Return the estimate in hours
         * @return {Number}
         */
        estimateInHours: function () {
            var value = parseFloat(this.estimate);
            if (isNaN(value)) {
                return 0.0;
            }
            return value / 3600;
        }
    });

Fetching and saving data.

module('myApp').controller('TaskCtrl', function ($scope, Task, $document) {

    Task.fetchOne(7).then(function (task7) { // Fetches '/api/tasks/7'
        $scope.task = task7;
        $document.title = task7.title  + ' - MyApp';
    });

    /**
     * @param {Task} task
     */
    $scope.saveTask = function (task) {
        $scope.spinnerVisible = true;
        task.$save().then(function () {
            $scope.successVisible = true;
        }).catch(function (error) {
            $scope.error = error;
        }).finally(function () {
            $scope.spinnerVisible = false;
        });
    };
});

Loading models via ngRoute

module('myApp', ['ngRoute']).config(function ($routeProvider) {
    $routeProvider
        .when('/tasks', {
            templateUrl: 'tasks.html',
            controller: 'TaskListCtrl',
            resolve: {
                tasks: function (Task) {
                    return Task.fetchAll();
                }
            }
        })
        .when('/tasks/:taskId', {
            templateUrl: 'task.html',
            controller: 'TaskCtrl',
            resolve: {
                task: function ($routeParams, Task) {
                    return Task.fetchOne($routeParams.taskId);
                }
            }
        });
});

module('myApp').controller('TaskCtrl', function ($scope, task) {
    $scope.task = task;
});