我正在为我的存储提供商设置驱动程序系统。
我有一个非常基本的存储提供商:
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
被调用。驱动程序服务是提供程序的依赖项,应用程序被卡住了。
我觉得这有点傻,因为提供者的整个目的是它可以在使用之前配置,但是如果没有实例化你就无法获得它们。我想我在某个地方感到困惑......
有谁知道如何解决这个问题?
答案 0 :(得分:3)
问题不在于$ get已被执行 - 这是Angular已经找出要发送到$ get的依赖项。
您需要使用的是Angular's $injector service(具体为get方法)。
var driver = $injector.get(driverName);
我把quick Plnkr放在一起演示。