pas*_*lus 6 javascript angularjs angularjs-directive angular-services
在我的项目中,我必须使用动态工厂名称在角度js中创建动态工厂,如下所示
function createDynamicFactory(modId) {
return myModule.factory(modId + '-existingService', function (existingService) {
return existingService(modId);
});
}
Run Code Online (Sandbox Code Playgroud)
当我调用此函数时,我想获得具有动态名称的新工厂.不幸的是,这不起作用.我怎么能实现这个目标?以及如何动态注入我的控制器或指令?
您可以像这样注释您的服务生成器.它接受模块和扩展,然后注释对"echo"服务的依赖(只是我定义的示例服务,用于回显文本并将其记录到控制台),因此生成的服务可以使用它:
makeService = function(module, identifier) {
module.factory(identifier+'-service', ['echo', function(echo) {
return {
run: function(msg) {
return echo.echo(identifier + ": " + msg);
}
};
}]);
};
Run Code Online (Sandbox Code Playgroud)
然后你可以做一些动态服务:
makeService(app, 'ex1');
makeService(app, 'ex2');
Run Code Online (Sandbox Code Playgroud)
最后,有两种注入方式.如果你知道你的约定,你可以使用注释传递它,因为显示了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');
}]);
Run Code Online (Sandbox Code Playgroud)
这是完整的工作小提琴: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);
}
};
}];
};
Run Code Online (Sandbox Code Playgroud)
然后你得到一个对数组的引用,并在$ injector上调用instantiate,用依赖关系连接它:
var fn = makeService('ex2');
$scope.service2 = $injector.instantiate(fn).run('dynamically injected');
Run Code Online (Sandbox Code Playgroud)
这是该版本的小提琴:http://jsfiddle.net/jeremylikness/G98JD/2/
| 归档时间: |
|
| 查看次数: |
5088 次 |
| 最近记录: |