Javascript 如何在Angular js中创建动态工厂?

Javascript 如何在Angular js中创建动态工厂?,javascript,angularjs,angularjs-directive,angular-services,Javascript,Angularjs,Angularjs Directive,Angular Services,在我的项目中,我必须用angular js创建动态工厂,动态工厂名称如下 function createDynamicFactory(modId) { return myModule.factory(modId + '-existingService', function (existingService) { return existingService(modId); }); } 当我调用这个函数时,我想用动态名称获取新工厂。不幸的是,这不起作用。我

在我的项目中,我必须用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');
}]);
这是完整的小提琴作品:

更新:如果您想在模块初始化后动态创建服务,只需做一些细微的更改。不需要尝试注册模块,只需返回带注释的数组即可。第一个参数是依赖项,最后一个参数是要注册的函数:

makeService = function(identifier) {
    return ['echo', function(echo) {
        console.log("in service factory");
            return {
                run: function(msg) {
                    return echo.echo(identifier + ": " + msg);
                }
            };
        }];
    };
然后获得对数组的引用,并在$injector上调用instantiate以将其与依赖项连接起来:

var fn = makeService('ex2');
$scope.service2 = $injector.instantiate(fn).run('dynamically injected');

这个版本的关键是:

你能提供比“这不起作用”更深入的见解吗?@Marc:hi-Marc,我的意思是,如果我把断点放在上面的return语句(return-existingService(modId);)上,控件没有到达断点,尽管我调用了createDynamicFactory函数。嗨,jeremy,谢谢你的回复,在我的例子中,我动态调用makeService函数。我在这里更新了你的装备。它抛出了未知提供程序错误。在这种情况下,您只需要定义服务并使用$injector.instantiate将其连接起来。下面是一个工作示例:我可以将这些动态创建的工厂/服务声明为依赖项,而不是查找依赖项,就像$http和其他。例如:
App.controller('TestCtrl,['$http','dynamicFactory',function($http,dynamicFactory){…}])
?在我的情况下,工厂/服务名称不会更改。基本上,我有一个动态创建其他工厂/服务的提供商。