AngularJS动态依赖注入

时间:2016-09-22 20:09:48

标签: javascript 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 config 块的依赖项。我希望提供程序像对象/非角度服务一样加载,而不是要调用的$get方法。 事实并非如此,$get被调用。驱动程序服务是提供程序的依赖项,应用程序被卡住了。

我觉得这有点傻,因为提供者的整个目的是它可以在使用之前配置,但是如果没有实例化你就无法获得它们。我想我在某个地方感到困惑......

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

1 个答案:

答案 0 :(得分:3)

问题不在于$ get已被执行 - 这是Angular已经找出要发送到$ get的依赖项。

您需要使用的是Angular's $injector service(具体为get方法)。

var driver = $injector.get(driverName);

我把quick Plnkr放在一起演示。