我有一个带有工厂的角模块,它根据来自同一个模块上的常量的输入返回资源。
就像这样:
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(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);
});
});
}); 这仍然给了我一个错误,因为它似乎没有正确地在资源模块上创建工厂。
发布于 2014-07-08 20:50:16
这看起来有点像角质化,但您可以通过执行以下操作来完成您所描述的内容:
var someResources = ['FirstFactory', 'SecondFactory', 'ThirdFactory'];
var myResourceModule = angular.module('myResources', []);
angular.forEach(someResources, function (res) {
myResourceModule.controller(res, function ($scope) {
$scope.name = res;
});
});本质上,我们在角的头上定义根作用域之外的资源数组(这在功能上与定义常量相同)。然后,我们只需遍历该数组,并为数组中的每个项定义控制器。您可以这样在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;
});您可以将这个一般想法应用于在工厂中使用任何可注入的对象。
https://stackoverflow.com/questions/24640851
复制相似问题