2016-03-02 18 views
6

Tôi cần sử dụng nhiều phiên bản của một dịch vụ.Cách sử dụng nhà cung cấp dịch vụ?

Thông thường khi tôi sử dụng một ví dụ của dịch vụ này trong thành phần, tôi viết như thế này:

@Component({ 
    selector: 'one-component', 
    providers: [provide("token1", {useClass: Service})], 
    template: ` 
     <h1>App</h1> 
    ` 
}) 
export class OneComponent { 
    constructor(@Inject('token1') service:Service) {} 
} 

Nhưng bây giờ tôi cần phải sử dụng dịch vụ này trong Service2, tôi viết như thế này:

export class Service2 { 
    constructor(@Inject('token1') service:Service) {} 
} 

như bạn đã biết, nó cho thấy:

Không cung cấp

Service2 không có providers: [provide("token1", {useClass: Service})]. Nhưng tôi có thể thêm nó ở đâu vì nó không có @Component?

Cảm ơn

+0

bạn sử dụng Service2 ở đâu? – Ludohen

+0

@ Ludohen cảm ơn sự giúp đỡ, tôi sử dụng Service2 trong một thành phần. –

+0

Sau đó, những gì bạn đang cố gắng làm là chắc chắn có thể – Ludohen

Trả lời

2

Đáng buồn là cấu hình dịch vụ theo cách này hiện chưa được hỗ trợ và hiện không có kế hoạch để hỗ trợ thêm https://github.com/angular/angular/issues/5622

+0

cảm ơn đã cho tôi biết! –

0

Tôi không nghĩ rằng câu trả lời của Gunter là hoàn toàn đúng ở đây. Nếu tôi hiểu vấn đề của Hongbo Miao một cách chính xác, điều này có thể được "dễ dàng" đạt được. Nếu bạn muốn nhận một phiên bản dịch vụ mới trên mỗi lần tiêm, bạn phải sử dụng useFactory thay vì cấu hình nhà cung cấp useClass.

Sau đó, nếu bạn nhận được một lỗi không cung cấp cho "token1" trong Service2 đó là vì nó không phải cấu hình trên các vòi phun phải, anh chị em ruột hoặc cha mẹ của OneComponent ... nơi Service2 được tiêm.

Edit:

Để làm việc này bạn sẽ phải xác định nhà cung cấp ServiceService2 tại các thành phần gốc (ví dụ). Trong trường hợp này, tất cả sẽ chia sẻ cùng một trường hợp của các dịch vụ.

Nếu bạn muốn có các phiên bản khác nhau trong mỗi thành phần, hãy xác định các nhà cung cấp ở cấp thành phần, nơi các dịch vụ đang được sử dụng.

@Component({ 
    providers: [Service, Service2], 
    // Other config props 
}) 
export class RootComponent { 
} 

@Component({ 
    // Config props 
}) 
export class OneComponent { 
    constructor(public service: Service) {} 
    methodx() { 
    this.service... 
    } 
} 

@Component({ 
    // Config props 
}) 
export class TwoComponent { 
    constructor(public service: Service2) {} 
    methodx() { 
    this.service... 
    } 
} 

@Injectable() 
export class Service2 { 
    constructor(public service: Service) { 
    } 
} 

không phải là điều tốt nhất bạn làm và không được khuyến nghị. Sử dụng mã thông báo Loại thay thế (như đã hoàn tất trong mã ở trên).

Resources:

+0

cảm ơn, tôi sẽ sớm kiểm tra! –

+0

Dựa trên mã của bạn và những gì tôi muốn, tôi có một 'ThreeComponent' khác cũng sử dụng' Service', và tôi muốn 'OneComponent' và' ThreeComponent' sử dụng các trường hợp khác nhau của 'Service'. Đó là lý do tại sao tôi thêm mã thông báo khi sử dụng 'Dịch vụ'. Sau đó trong 'Service2', tôi không có cách nào để sử dụng' provider' cho 'Service'. –

+0

'Service2' không cần gì đặc biệt, các nhà cung cấp được định nghĩa ở trên trong cây phun – Ludohen

0

tôi đã sửa lỗi này (Sử dụng dịch vụ B thành một dịch vụ A) bằng cách tuyên bố hai dịch vụ trong app.module.ts 's cung cấp mảng .

@NgModule({ 
    declarations: [...], 
    imports:  [...], 
    providers: [ 
     ServiceA, 
     ServiceB, 
    ], 
    bootstrap: [...], 
}) 
Các vấn đề liên quan