2016-09-22 12 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, который устанавливается в качестве службы впрыснуть. Я хочу, чтобы водители были сервисами в Угловом приложении; помимо «чистого и красивого» способа, который он приносит, я также хочу, чтобы эти драйверы были импортированы из других модулей и программно определены как драйвер для использования.

В чем проблема с этой настройкой?

storageProvider является зависимостью config блок. Я ожидал, что провайдер будет загружен как объект/не угловая служба, а не метод $get. Это не так, $get называется. Служба драйвера, являющаяся зависимостью провайдера, приложение застревает.

Я нахожу это немного глупым, потому что вся цель провайдера заключается в том, что его можно настроить перед использованием, но вы не можете получить их без создания экземпляра. Я думаю, что я где-то запутался ...

Кто-нибудь знает, как это решить?

ответ

2

Проблема не в том, что $ get был выполнен - ​​это то, что Angular уже выяснил, какие зависимости отправлять в $ get.

Вместо этого необходимо использовать Angular's $injector service (метод получения).

var driver = $injector.get(driverName); 

Я собрал quick Plnkr для демонстрации.

+0

Я пробовал этот подход, и он работает. Я ошибся с именем драйвера в 'storageProvider.setDriverName ('StorageDriver_LocalStorage');' ... позорить меня – JesusTheHun

Смежные вопросы