Angular:在run()函数中为模块添加工厂方法
Angular: Adding factory methods on module from within run() function
我有一个带有工厂的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;
});
相关文章:
- 使用System.JS添加模块
- 如何为JS模块添加包含路径
- 将节点模块添加到gitignore
- 如何在RT上添加插件和使用一些外部模块/文件
- Mozilla”;添加“;sdk,简单的pref模块,动态选项(取决于以前选项的选项)
- 添加角光栅时模块实例化失败
- 如何将样式表和jQuery添加到Joomla 3.x模块
- 如何将JavaScript模块添加到生成器meanjs应用程序中
- 错误: [$injector:nomod] 尝试将第三方模块添加到表示应用程序时
- 是否有充分的理由为所有 JavaScript 模块添加前缀“$”
- 动态地将模块添加到我的Angular应用程序中
- 如何向nodejs超级测试模块添加方法
- 我可以向另一个模块中用作依赖项的requirejs模块添加一个方法,并在每次将该模块作为依赖项加载时使其可用吗
- 在同一页面上向Joomla模块添加多个Javascript声明
- 将JavaScript模块添加到全局范围的跨平台方式是什么
- 如何从节点模块添加新的css文件
- Angular:在run()函数中为模块添加工厂方法
- 如何在Node中将函数作为模块添加到现有对象中
- jquery globalize:如何将我需要的模块添加到项目中
- 如何将模块添加到我的SystemJs配置文件中,以便我可以以angular方式导入它