angular-base-class

An AngularJS factory for simple class based inheritance with support for mixins

Module License: MIT

Added by: Sam Deering

GitHub

Repository

aj-dev/angular-base-class

Stats

Stars: 1

Watchers: 1

Forks: 0

Author

Aj-dev
Aj-dev

Module Description

angular-base-class

Build Status Dependencies DevDependencies Coverage Status npm

An AngularJS factory for simple class based inheritance with support for mixins

Table of contents

  1. Key features
  2. Installation
  3. Usage
  4. Running tests
  5. Credits
  6. License

Key features

  • Constructor definition is optional
  • Uses this._super('methodName', arguments) to call super class methods
  • Supports multiple inheritance by resolving correct this context in super() calls
  • Mixins can be injected and used by adding them to mixins: []
  • Does not override inherited mixins
  • Compatible with AngularJS 1.2.x and 1.3.x

Installation

  • bower install angular-base-class --save

Usage

  • Include angular-base-class.min.js in your project
  • Add module BaseClass as dependency to your AngularJS app
Default constructor
angular.module('App', ['BaseClass'])
    .factory('Mammal', ['BaseClass', function (BaseClass) {
        return BaseClass.extend({
            setAge: function (age) {
                this.age = age;
            },
            getAge: function () {
                return this.age;
            }
        });
    }])
    .factory('Dog', ['Mammal', function (Mammal) {
        return Mammal.extend({
            setAge: function (age) {
                this._super('setAge', age + 10);
            },
            getAge: function () {
                return 'Dog is ' + this._super('getAge') + ' years old';
            }
        })
    }])
    .controller('Ctrl', ['$scope', 'Dog', function ($scope, Dog) {
        $scope.dog = new Dog({age: 5});
        $scope.dog.getAge(); // Dog is 5 years old
        $scope.dog.setAge(8);
        $scope.dog.getAge(); // Dog is 18 years old
    }]);
Custom constructor
angular.module('App', ['BaseClass'])
    .factory('Mammal', ['BaseClass', function (BaseClass) {
        return BaseClass.extend({
            constructor: function (args) {
                this.age = args.age + 1;
            },
            setAge: function (age) {
                this.age = age;
            },
            getAge: function () {
                return this.age;
            }
        });
    }])
    .factory('Dog', ['Mammal', function (Mammal) {
        return Mammal.extend({
            constructor: function () {
                this._super('constructor', arguments);
            },
            setAge: function (age) {
                this._super('setAge', age + 10);
            },
            getAge: function () {
                return 'Dog is ' + this._super('getAge') + ' years old';
            },
        })
    }])
    .controller('Ctrl', ['$scope', 'Dog', function ($scope, Dog) {
        $scope.dog = new Dog({age: 5});
        $scope.dog.getAge(); // Dog is 6 years old
        $scope.dog.setAge(8);
        $scope.dog.getAge(); // Dog is 18 years old
    }]);
With mixins
angular.module('App', ['BaseClass'])
    .factory('mammalMixin', [function () {
        return {
            grow: function (number) {
                this.age += number;
            },
            getName: function () {
                return this.name;
            }
        };
    }]);
    .factory('Mammal', ['BaseClass', 'mammalMixin', function (BaseClass, mammalMixin) {
        return BaseClass.extend({
            constructor: function (args) {
                this.name = args.name;
                this.age = args.age;
            },
            setAge: function (age) {
                this.age = age;
            },
            getAge: function () {
                return this.age;
            },
            mixins: [mammalMixin]
        });
    }])
    .factory('Cat', ['Mammal', function (Mammal) {
        return Mammal.extend({
            getAgeAndName: function () {
                return 'Age: ' + this.getAge() + ' Name: ' + this.getName();
            }
        });
    }])
    .controller('Ctrl', ['$scope', 'Cat', function ($scope, Cat) {
        $scope.dog = new Cat({name: 'Meow', age: 5});
        $scope.dog.getAge(); // 5
        $scope.dog.setAge(8);
        $scope.dog.getAge(); // 8
        $scope.dog.getName(); // Meow
        $scope.dog.getAgeAndName(); // Age: 8 Name: Meow
        $scope.dog.grow(2);
        $scope.dog.getAge(); // 10

    }]);

Running tests

  • Get the source code
  • npm install
  • grunt test

Credits

Some ideas were borrowed from the following:

  • Axel Rauschmayer - http://www.2ality.com/
  • http://backbonejs.org/

License

Licensed under the MIT license. Copyright (c) 2015 Audrius Jakumavicius

Module stats last updated: 2015-06-07 05:48:57

Disclaimer: Some data on this page may have been gathered from the authors GitHub respository. If you see any mistakes or outdated information please let us know. Thanks!