[英]AngularJS dynamic dependency injection
我正在为存储提供商设置驱动程序系统。
我有一个非常基本的存储提供商:
angular.module('mooseGarden').provider('storage', function () {
var storage = this;
var driverName;
this.setDriverName = function(name) {
driverName = name;
return storage;
};
this.getDriverName = function() {
return driverName;
};
this.$get = [driverName, function(driver) {
return {
set: function(key, value) {
driver.set(key, value);
},
get: function(key) {
driver.get(key);
}
};
}];
});
这是这样配置的:
app.config(['storageProvider', function(storageProvider) {
storageProvider.setDriverName('StorageDriver_LocalStorage');
}]);
StorageDriver_LocalStorage
在应用程序的其他位置定义。
提供者
您会注意到将变量driverName
设置为要注入的服务。 我希望驱动程序成为Angular应用程序中的服务; 除了带来“干净漂亮”的方式外,我还希望这些驱动程序可以从其他模块中导入,并以编程方式定义为要使用的驱动程序。
此设置有什么问题?
storageProvider
是config块的依赖项。 我希望提供程序像对象一样加载/不是角度服务,而不是调用$get
方法。 碰巧不是这样,调用$get
。 驱动程序服务是提供程序的依赖项,应用程序被卡住。
我觉得这有点愚蠢,因为提供程序的全部目的是可以在使用前对其进行配置,但是如果没有实例化就无法获取它们。 我觉得我在某个地方感到困惑...
有谁知道如何解决这个问题?
问题不是$ get已经执行-而是Angular已经弄清楚要发送到$ get的依赖项。
您需要使用的是Angular的$ injector服务 (特别是get方法)。
var driver = $injector.get(driverName);
我汇集了一个快速的Plnkr进行演示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.