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循环来创建工厂?我应该在配置中完成吗?或者,在另一家工厂?你明白为什么你的例子对我不起作用吗?