在我的项目中,我必须使用如下所示的动态工厂名称在angular js中创建动态工厂
function createDynamicFactory(modId) {
return myModule.factory(modId + '-existingService', function (existingService) {
return existingService(modId);
});
}
当我调用此函数时,我想使用动态名称获取新工厂。不幸的是,这是行不通的。我怎样才能做到这一点?以及如何动态注入我的控制器或指令中?
您可以这样注释您的服务生成器。它使用模块和扩展,然后注释对“ echo”服务的依赖关系(只是我定义的示例服务,用于将文本回显并记录到控制台),以便生成的服务可以使用它:
makeService = function(module, identifier) {
module.factory(identifier+'-service', ['echo', function(echo) {
return {
run: function(msg) {
return echo.echo(identifier + ": " + msg);
}
};
}]);
};
然后,您可以进行一些动态服务:
makeService(app, 'ex1');
makeService(app, 'ex2');
最后,有两种注入方式。如果您知道约定,则可以在显示ext1时将其与注释一起传递。否则,只需获取$ injector的实例并以这种方式获取它。
app.controller("myController", ['ex1-service',
'$injector',
'$scope',
function(service, $injector, $scope) {
$scope.service1 = service.run('injected.');
$scope.service2 = $injector.get('ex2-service').run('dynamically injected');
}]);
这是完整的工作提琴:http : //jsfiddle.net/jeremylikness/QM52v/1/
更新:如果要在模块初始化后动态创建服务,则需要进行一些细微更改。无需尝试注册模块,只需返回一个带注释的数组。第一个参数是依赖项,最后一个是要注册的函数:
makeService = function(identifier) {
return ['echo', function(echo) {
console.log("in service factory");
return {
run: function(msg) {
return echo.echo(identifier + ": " + msg);
}
};
}];
};
然后,您获得对该数组的引用,并在$ injector上调用实例化以将其与依赖项连接起来:
var fn = makeService('ex2');
$scope.service2 = $injector.instantiate(fn).run('dynamically injected');
这是该版本的小提琴:http : //jsfiddle.net/jeremylikness/G98JD/2/
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句