Angular:在run()函数中为模块添加工厂方法

Angular: Adding factory methods on module from within run() function

本文关键字:模块 添加 加工厂 方法 函数 run Angular      更新时间:2023-09-26

我有一个带有工厂的angular模块,该工厂根据同一模块上的常量输入返回资源。

一样:

angular.module('resources', [])
    .constant('resourceMap', { 
        resource1: { ... },
        resource2: { ... },
        resource3: { ... },
        ...
    })
    .factory('resourcebuilder', function($resource) {
        return {
            build: function(resourceData) {
                return $resource(resourceData);
            }
        };
    });

然后我可以创建工厂返回这些资源,像这样:

angular.module('resources')
    .factory("resource1" function(resourceMap, resourceBuilder) {
        return resourceBuilder.build(resourceMap["resource1"]);
    })
    .factory("resource2" function(resourceMap, resourceBuilder) {
        return resourceBuilder.build(resourceMap["resource2"]);
    })
    .factory( ...

但是,我希望能够遍历ResourceMap中的键,并在每次迭代时为资源创建一个工厂。我试着把它放在run函数中,比如:

.run(function(resourceMap, resourceBuilder) {
    for (res in resourceMap) {
        angular.module('resources')
            .factory(res, function(resourceMap, resourceBuilder) {
                return resourceBuilder.build(resourceMap[res]);
            });
    };
});

但这不起作用。有人知道我怎么做吗?

问题与资源函数没有任何关系。基本上,我需要找出一种方法,从同一模块上的某种工厂/服务中添加工厂到模块。

编辑:

我尝试创建另一个模块,将资源模块作为依赖项注入,并使用angular。foreach循环遍历resourceMap并创建如下的工厂:

var resourceProvider = angular.module("resourceProvider", ['resources'])
resourceProvider.run(function(resourceBuilder, resourceMap) {
    angular.forEach(resourceMap, function(val, key) {
        resources.factory(key, function(resourceBuilder, resourceMap) {
            return resourceBuilder.build(val);
        });
    });
});      

这仍然给我一个错误,因为它似乎没有正确地在资源模块上创建工厂。

这看起来有点像Angular的堕落,但你可以通过以下操作来完成你所描述的:

var someResources = ['FirstFactory', 'SecondFactory', 'ThirdFactory'];
var myResourceModule = angular.module('myResources', []);
angular.forEach(someResources, function (res) {
  myResourceModule.controller(res, function ($scope) {
    $scope.name = res;
  });
});
从本质上讲,我们是在绕过Angular,在根作用域之外定义我们的资源数组(这在功能上与定义常量是一样的)。然后我们遍历那个数组并为数组中的每一项定义控制器。你可以在你的html中这样使用:
<div ng-app="myResources">
  <div ng-controller="FirstFactory">
    {{name}} // Shows "FirstFactory"
  </div>
  <div ng-controller="SecondFactory">
    {{name}} // Shows "SecondFactory"
  </div>
  <div ng-controller="ThirdFactory">
    {{name}} // Shows "ThirdFactory"
  </div>
</div>

下面是一个活塞运行的例子:http://plnkr.co/edit/e7nskmOgCx0R0ZQTBBhg?p=preview

可以扩展此代码以创建服务、工厂等。希望这对你有帮助!

——编辑——

我编辑了柱塞的例子,包括一个服务参考:http://plnkr.co/edit/e7nskmOgCx0R0ZQTBBhg?p=preview

你可以在你的控制器/工厂中引用服务,就像你引用任何服务一样。只需创建服务并将其注入到控制器/工厂声明中。

我们的资源服务:

myResourceModule.service('resourceService', function() {
    var srv = {};
    srv.name = 'I''m the resource service!'; 
    return srv;
});

依赖于资源服务的控制器:

myResourceModule.controller(res, function($scope, resourceService) {
  $scope.name = res;
  $scope.resourceSrvName = resourceService.name;
});