Javascript 是否有可能以良好的形式在Angular中重用相同的数据工厂?

Javascript 是否有可能以良好的形式在Angular中重用相同的数据工厂?,javascript,angularjs,factory,Javascript,Angularjs,Factory,我正在查看Angular的CRUD通用工厂(我目前更倾向于使用该工厂而非服务): 对于我的所有实体,这段代码大致相同。是否可以注入实体名称(或相应的RESTful路径),如果可以,是否可以将其视为部分类,如果需要额外的承诺(例如遍历导航属性),也可以注入这些承诺 如果Angular可以做到这一点,有人能举一些例子吗?我个人喜欢保留我的代码,我发现如果你在服务器API上保留一个通用的约定,你可以使用一个基本工厂/存储库/类或任何你想调用的东西。我在AngularJs中实现这一点的方法是使用Angu

我正在查看Angular的CRUD通用工厂(我目前更倾向于使用该工厂而非服务):

对于我的所有实体,这段代码大致相同。是否可以注入实体名称(或相应的RESTful路径),如果可以,是否可以将其视为部分类,如果需要额外的承诺(例如遍历导航属性),也可以注入这些承诺


如果Angular可以做到这一点,有人能举一些例子吗?

我个人喜欢保留我的代码,我发现如果你在服务器API上保留一个通用的约定,你可以使用一个基本工厂/存储库/类或任何你想调用的东西。我在AngularJs中实现这一点的方法是使用AngularJs工厂返回一个基本存储库类,即该工厂返回一个带有原型定义的javascript类函数,而不是对象实例,我称之为
abstractRepository
。然后,对于每个资源,我为该特定资源创建一个具体的存储库,该特定资源通常从
abstractRepository
继承,因此我从
abstractRepository
继承所有共享/基础特性,并将任何特定于资源的特性定义到具体的存储库

我认为一个例子会更清楚。让我们假设您的服务器API使用以下URL约定(我不是最纯粹的REST,因此我们将根据您想要实现的内容来决定该约定):

我个人使用它,所以下面的示例是基于它的,但是您应该能够轻松地将其应用于
$http
$resource

abstractRepository

app.factory('abstractRepository', [function () {

    function abstractRepository(restangular, route) {
        this.restangular = restangular;
        this.route = route;
    }

    abstractRepository.prototype = {
        getList: function (params) {
            return this.restangular.all(this.route).getList(params);
        },
        get: function (id) {
            return this.restangular.one(this.route, id).get();
        },
        getView: function (id) {
            return this.restangular.one(this.route, id).one(this.route + 'view').get();
        },
        update: function (updatedResource) {
            return updatedResource.put();
        },
        create: function (newResource) {
            return this.restangular.all(this.route).post(newResource);
        }
        // etc.
    };

    abstractRepository.extend = function (repository) {
        repository.prototype = Object.create(abstractRepository.prototype);
        repository.prototype.constructor = repository;
    };

    return abstractRepository;
}]);
具体的存储库,让我们以客户为例:

app.factory('customerRepository', ['Restangular', 'abstractRepository', function (restangular, abstractRepository) {

    function customerRepository() {
        abstractRepository.call(this, restangular, 'customers');
    }

    abstractRepository.extend(customerRepository);
    return new customerRepository();
}]);
然后在控制器中注入
customerRepository

app.controller('CustomerController', ['$scope', 'customerRepository', function($scope, customerRepository) {
    // Use your customerRepository
}]);

如果您使用此基本存储库模式,您会发现大多数CRUD控制器也将共享许多公共代码,因此我通常创建一个基本CRUD控制器,我的控制器通过使用
$injector.invoke
,继承该控制器,但我将省略此示例,因为它超出了此问题的范围。

好东西。我对
$http
进行了简单的重构,以后可能会对其进行更改。。。小步走。我将ODataURL库放在具体的存储库中,而不是控制器中。当然可以,但不知道是否推荐?我真的很喜欢这种方法!很好,我在找它!
app.factory('customerRepository', ['Restangular', 'abstractRepository', function (restangular, abstractRepository) {

    function customerRepository() {
        abstractRepository.call(this, restangular, 'customers');
    }

    abstractRepository.extend(customerRepository);
    return new customerRepository();
}]);
app.controller('CustomerController', ['$scope', 'customerRepository', function($scope, customerRepository) {
    // Use your customerRepository
}]);