$http 统一资源封装方案

这篇文章(5620b0c5079a12ff3c4b2fe0)是从 Teambition 迁移过来的

封装

(function () {
    'use strict';

    angular.module('UM.comm',[])
    .factory('Resources',Resources);

    /**
     * 统一资源生成器
     * @param {$http} $http angular 内置方法
     */
    function Resources($http){
        function ResourceConstructor(options){
                        var _uri = options.uri;
            var _isArray = options.isArray;
            var _res = _isArray ? [] : {};

            Object.defineProperties(
                _res,
                {
                    'setData' : {
                        value : _defineSetDataFunction(_isArray)
                    },
                    'get' : {
                        value : _get
                    },
                    'add' : {
                        value : _add
                    },
                    'delete' : {
                        value : _delete
                    }
                }
            );

            function _defineSetDataFunction(_isArray) {
                if (_isArray) {
                    return function (_data) {
                        _res.length = 0;
                        _res.splice.apply(_res, [1, 0].concat(_data));
                    };
                } else {
                    return function (_data) {
                        angular.copy(_res, _data);
                    };
                }
            }

            function _get() {
                return $http.get(_uri).success(function(_data) {
                        _res.setData(_data);
                });
            }

            function _add(_newData) {
                return $http.post(_uri, _newData).success(function(_data) {
                        // 
                });             
            }

            function _delete(_items) {
                var items = [];
                return $http.delete(_uri, {params:{ del : _items }})            
            }
            return _res;
        }

        return ResourceConstructor;
    }
    Resources.$injector = ['$http'];


})();

生成实例

    angular.module('UM.organization', ['UM.comm','ngMaterial'])
        .factory('ResOrgs', ResOrgs)

    function ResOrgs(Resources) {
        return new Resources({ 
                     uri : '/api/orgs',
                     isArray : true
                });
    }
    ResOrgs.$injector = ['Resources'];