2016-09-22 4 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 메쏘드가 아닌 각도 서비스가 될 것을 기대했다. 그런 경우가 아니기 때문에 $get이 호출됩니다. 드라이버 서비스가 공급자의 종속성이되어 응용 프로그램이 작동하지 않습니다.

공급자의 전체 목적은 사용하기 전에 구성 할 수 있다는 것이기 때문에 약간의 어리 석음이 있지만 아직 인스턴스화하지 않고는 가져올 수 없기 때문에 약간 바보입니다. 나는 어딘가에서 혼란스럽게 생각한다. ...

누군가는 이것을 해결하는 방법을 알고 있냐?

답변

2

문제는 $ get이 실행되지 않았다는 것입니다. Angular가 이미 $ get에 보낼 종속성을 알아 냈습니다.

대신 사용해야하는 것은 Angular's $injector service (구체적으로 get 메소드)입니다.

var driver = $injector.get(driverName); 

나는 quick Plnkr을 함께 던집니다.

+0

이 방법을 시도해 보았습니다. 나는'storageProvider.setDriverName ('StorageDriver_LocalStorage');에서 드라이버 이름을 잘못 썼다. – JesusTheHun