gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 05:10:20 25 4
gpt4 key购买 nike

在我的项目中,我必须使用如下动态工厂名称在 Angular js 中创建动态工厂

  function createDynamicFactory(modId) {
return myModule.factory(modId + '-existingService', function (existingService) {
return existingService(modId);
});
}

当我调用此函数时,我想获得具有动态名称的新工厂。不幸的是,这是行不通的。我怎样才能做到这一点?以及如何动态注入(inject)我的 Controller 或指令?

最佳答案

您可以像这样注释您的服务生成器。它采用模块和扩展,然后注释对“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');

最后,有两种注入(inject)方式。如果您知道自己的约定,则可以将其与显示的 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');
}]);

这是完整的工作 fiddle :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');

这是该版本的 fiddle :http://jsfiddle.net/jeremylikness/G98JD/2/

关于javascript - 如何在 Angular js 中创建动态工厂?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21733661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com