2016-09-22 230 views
1

我为我的存储提供者设置了一个驱动程序系统。AngularJS动态依赖注入

我有一个非常基本的存储提供商:

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配置块的依赖关系。我期望提供者能够像对象/非角度服务一样被加载,而不是被调用的方法。 事情并非如此,$get被调用。驱动程序服务是提供程序的依赖项,该应用程序被卡住了。

我觉得这是一个有点傻,因为供应商的整个目的是,它可以在使用前进行配置,但如果没有实例化,你不能让他们。我觉得我有些困惑...

有谁知道如何解决这个问题?

回答

2

问题不在于$ get已经被执行 - 这是因为Angular已经找到了发送到$ get的依赖关系。

你需要什么,而不是用的是Angular's $injector service(GET方法明确)。

var driver = $injector.get(driverName); 

我把一个quick Plnkr放在一起来演示。

+0

我试过这种方法,它工作。我在'storageProvider.setDriverName('StorageDriver_LocalStorage');'...拼写错误' – JesusTheHun