Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 角度:在run()函数中为模块添加工厂方法_Javascript_Angularjs_Web Applications - Fatal编程技术网

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

Javascript 角度:在run()函数中为模块添加工厂方法,javascript,angularjs,web-applications,Javascript,Angularjs,Web Applications,我有一个带工厂的角度模块,它根据同一模块上常数的输入返回资源 像这样: angular.module('resources', []) .constant('resourceMap', { resource1: { ... }, resource2: { ... }, resource3: { ... }, ... }) .factory('resourcebuilder', function($resou

我有一个带工厂的角度模块,它根据同一模块上常数的输入返回资源

像这样:

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);
        });
    });
});      
<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>

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

这似乎有点像是对Angular的bastardization,但您可以通过执行以下操作来完成所描述的内容:

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中这样使用:

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);
        });
    });
});      
<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>
依赖于我们的资源服务的控制器:

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;
});

您可以在工厂内使用任何可注射对象。

谢谢。您知道我是否可以在foreach中循环resourceMap常量?我不知道当不在角度模块内时如何访问resourceBuild工厂或resourceMap常量。我更新了我的问题。还是没法让它工作。你知道我做错了什么吗?同样,resourceMap常量是我试图迭代的对象。在您的示例中,您正在迭代一个名为someResources的全局变量,它没有显示如何执行我正在尝试的操作。我想我总是可以把我的resourcedMap变成一个全局变量,但我想知道是否有一个解决方案可以“以角度的方式”实现它。@SeanGeoffreyPietz我相信你的问题是你试图在这里使用一个run块。运行块在创建喷油器之后执行,这意味着它在您可以声明工厂的点之后执行。你的首要目标是什么?我认为要访问angular工厂/常量(resourceMap和resourceBuilder),我需要在angular模块中并注入它们。我在哪里可以运行这个forEach循环来创建工厂?我应该在配置中完成吗?或者,在另一家工厂?你明白为什么你的例子对我不起作用吗?