2016-11-27 25 views
7

tôi sử dụng Angular2 v2.2.3Angular2 - không đồng bộ phụ thuộc tiêm

tôi đã tạo ra mô-đun chung với forRoot() chức năng, như thế này:

... 
    public static forRoot(): ModuleWithProviders { 
    return { 
     ngModule: CommonsModule, 
     providers: [ 
      SomeOtherDependency, 
      { 
       provide: ConfigService, 
       useFactory: ConfigFactory, 
       deps: [Http] 
      }     
     ] 
    }; 

Đây là ConfigFactory tôi:

export function ConfigFactory(http:Http):Promise<ConfigService> {  
    return http.get('confg/config.json').map(r => { 
     return new ConfigService(r); 
    }).toPromise(); 
} 

Tôi cũng đã cố gắng trả lại Lời hứa và Quan sát.

SomeOtherDependency được định nghĩa trong nhà cung cấp yêu cầu ConfigService. Vấn đề là Angular không bơm giá trị được giải quyết bằng lời hứa nhưng tự hứa.

Làm thế nào tôi có thể buộc góc để chờ cho đến khi lời hứa được giải quyết với sự phụ thuộc phù hợp và chỉ sau đó tiêm nó vào các phụ thuộc khác?

Tôi đã thử các cách tiếp cận khác nhau và giá trị luôn được tiêm là hứa hẹn hoặc có thể quan sát được. Cũng giống như iniector bỏ qua những gì loại nhà máy trở lại. Tôi cần tải một số tệp json trước khi toàn bộ ứng dụng bắt đầu

+0

có thể trùng lặp của [kiễu góc 2 - Các dịch vụ tiêu thụ người khác dịch vụ trước khi gọi một phương thức] (http://stackoverflow.com/câu hỏi/38127741/góc-2-dịch vụ-tiêu thụ-những người khác-dịch vụ-trước-gọi-a-phương pháp) – estus

+0

Kiểm tra cũng ý kiến ​​cho câu hỏi này http://stackoverflow.com/questions/40522938/lazy-loading-module -with-app-initializer? noredirect = 1 # comment68288686_40522938 – yurzui

+0

Tôi đã nhìn thấy chủ đề này trước khi tôi hỏi. Họ không làm việc cho tôi. –

Trả lời

3

Tôi đã tìm thấy sự cố.

Tôi đã trả lại lời hứa từ nhà máy của mình khi tôi cần trả lại hàm thay thế. Ngoài ra tôi đã bỏ lỡ "đa" đối số từ phần nhà cung cấp. Đây được cập nhật nhà máy hoạt động với APP_INITIALIZER:

export function ConfigFactory(config:ConfigService, http:Http):Function { 
    return() => config.load(http); 
} 

Và trong mô-đun:

providers: [ 
    ConfigService, 
    { 
     provide: APP_INITIALIZER, 
     useFactory: ConfigFactory, 
     deps: [ConfigService, Http], 
     multi: true 
    }, 
] 
+0

Làm cách nào tôi có thể sử dụng giá trị này trên một thành phần khác? Xin vui lòng gửi một ví dụ bằng cách sử dụng plnkr.co – gtzinos

+0

Sử dụng nó như mọi khi: constructor (private configService: ConfigService) {}. Tôi sẽ được tiêm mà không có vấn đề gì. –

Các vấn đề liên quan