2016-06-12 3 views
1

내 앱에서 config 블록에 "dateFilter"를 주입해야합니다. 나는 이런 식으로 할 수 없습니다 알고 dateFilter 이후AngularJS - 설정에서 주입

.config(function(dateFilter){}) 

는 공급자 또는 일정하지가 config 동안 사용할 수없는.

angular.injector(["ng"]).get('dateFilter')('2014-01-01','yyyy/MM/dd'); 

이 내가 config 동안 아무것도 얻을 수 있다는 것을 의미하지 않습니다 :

그러나, 몇 가지 조사 후, 나는하여 config에 다음 그것을 사용하여 작동했다? 그렇다면 providersconstants 만 주사하는 점은 config 동안 무엇입니까? config 동안 angular.injector(["ng"]).get('dateFilter')과 같은 일을하는 것이 나쁜가요?

+0

이 작업을 거의 수행 할 필요가 없으며 둘 중 어느 것도 필요하지 않지만 구성에 직접 필요한 이유를 표시하거나 설명하지 않은 경우가 있습니다. 라우팅 사례에 지역 사례를 삽입 할 수 있습니다 (유스 케이스와 관련이있는 경우) – charlietfl

+0

http://stackoverflow.com/questions/32566416/change-format-of-md-datepicker-in-angular-material 여기에 대한 답변은 다음과 같습니다. 내가 뭘하고 싶은지. 나는 순간을 사용하지 않는다. 그래서 대신 dateFilter를 사용한다. – Shawn

+0

대신에'run()'블록에서 수행 할 수 있습니다. – charlietfl

답변

1

angular.injector은 상황이 실제로 이국적이지 않은 경우 (예 : 거의 없다). 새로운 인젝터 인스턴스를 생성하고 약간의 오버 헤드가 발생합니다. 기존의 Angular DI는 테스트 가능성이 좋으며, angular.injector은 테스트의 일부를 테스트 할 수없는 코드로 변환합니다. 가능한 경우 항상 앱 내부에서 현재 인젝터를 다시 사용합니다 (즉, 거의 항상).

일반적으로 '구성 블록에서 서비스 인스턴스를 사용하는 방법'질문 유형은 XY 문제를 나타냅니다. Angular가 config을 사용하여 서비스 인스턴스 (닭고기 달걀 딜레마)를 만드는 서비스 공급자를 구성하는 사실은 응용 프로그램이 각도 수명주기와 관련하여 리팩터링되어야 함을 나타냅니다.

그러나 기본 제공 필터는 상태 비 저장 도우미 함수이므로 설정 단계에서의 사용은 상대적으로 무해합니다. dateFilter service is defined by $filterProvider$filterProvider을 주입하여 dateFilterProvider에 도달해야합니다. 문제는 아직 구체화되지 않은 dateFilterdepends on $locale service입니다. $locale은 다른 서비스에 종속되지 않으므로 (넓은 의미에서) 상수이므로 인스턴스화해야합니다.

angular.module('...', [ 
    'ngLocale' // if used, should be loaded in this module 
]) 
.config(($filterProvider, $localeProvider, $provide, $injector) => { 
    var $locale = $injector.invoke($localeProvider.$get); 
    var dateFilterProvider = $injector.get('dateFilterProvider') 
    var dateFilter = $injector.invoke(dateFilterProvider.$get, { $locale: $locale }); 

    $provide.constant('dateHelper', dateFilter); 
}) 

는 해킹 테스트에서 고려 ( dateHelper 서비스가 피상적으로 테스트한다)하지만, 상대적으로 문제가 무료 관용적입니다해야합니다.

+0

'angular.injector'는 새로운 인스턴스를 생성하지만'$ injector'는 현재 인스턴스를 재사용합니까? 당신의 예제에서와 같이'$ injector'를 사용하는 것이 좋습니다. – Shawn

+0

예. $ injector.get()을 사용하여 config에 서비스 인스턴스를 가져올 수 없으므로 $ injector.invoke를 $ get 함수와 함께 호출해야합니다. – estus

+0

이 줄이 필요합니까'$ provide.constant ('dateHelper', dateFilter);'? 나는'var dateFilter = $ injector.invoke (dateFilterProvider. $ get, {$ locale : $ locale}); ','뒤에'dateFilter'를 사용할 수 있습니다. – Shawn

0
만 제공하지만 여기 app.run에서 그것을 할 수있는 호출 순서의 설정에서 서비스를 주입하지 못할

:

  1. 의 app.config() //에만
  2. app.run를 주입 할 수 제공 (그들이 DOM에서 발견되는 경우) (찾을 경우, 다시)() // 서비스는
  3. app.controller()
  4. 지침의 링크 기능을
  5. 지침의 컴파일 기능을 주입 할 수
관련 문제