2016-10-03 20 views
10

Tôi đang cố gắng chuyển ứng dụng Ionic2.beta11 của mình sang bản phát hành Ionic2.rc0 mới. Hầu hết mọi thứ đã khá thẳng về phía trước, nhưng tôi có một vấn đề với trình biên dịch AoT.Làm thế nào tôi có thể vượt qua một đối số cho một nhà xây dựng nhà cung cấp trong Ionic2/Angular2?

Tôi có một AuthService:

@Injectable() 
export class AuthService { 
    constructor(@Inject(Http) http: Http) { 
    this.http = http; 
    } 
    ... 
} 

Tôi tiêm nó vào ứng dụng của tôi trong src/app/app.module.ts file:

@NgModule({ 
    declarations: [ 
    MyApp, 
    ... 
    ], 
    imports: [ 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    ... 
    ], 
    providers: [ 
    AuthService 
    ] 
}) 

Tất cả mọi thứ hoạt động tốt khi chạy ion phục vụ, nhưng khi tôi cố gắng xây dựng tôi nhận được lỗi sau:

ngc error: Error: Error at .../.tmp/app/app.module.ngfactory.ts:397:78: Supplied parameters do not match any signature of call target. 

Dòng 396 - 399:

get _AuthService_74():import44.AuthService { 
    if ((this.__AuthService_74 == (null as any))) { (this.__AuthService_74 = new import44.AuthService()); } 
    return this.__AuthService_74; 
} 

Vấn đề là new import44.AuthService() mong đợi đối số của loại http.

Điều thú vị là mọi thứ hoạt động tốt khi tôi thay thế constructor(http: Http) bằng constructor() trong tệp định nghĩa theo cách thủ công.

Tôi đã đọc qua tất cả các câu trả lời của StackOverflow mà tôi có thể tìm thấy, nhưng không có giải pháp nào giải quyết được vấn đề của tôi.

Tôi có cần thay đổi hàm tạo trong AuthService hoặc cách tôi chèn nó vào ứng dụng của mình không? Cảm ơn sự giúp đỡ của bạn.

+0

Là một giải pháp tạm thời tôi đã đối số tùy chọn và nó hoạt động ngay bây giờ. Nhưng tôi vẫn đang tìm một giải pháp thích hợp. –

Trả lời

0

nhập HttpModule từ @angular/http trong mô-đun ứng dụng của bạn như sau:

import { HttpModule } from '@angular/http'; 
@NgModule({ 
    declarations: [ 
    MyApp, 
    ... 
    ], 
    imports: [ 
    HttpModule, 
    IonicModule.forRoot(MyApp) 
    ], 
    bootstrap: [IonicApp], 
    entryComponents: [ 
    MyApp, 
    ... 
    ], 
    providers: [ 
    AuthService 
    ] 
}) 

Thay đổi dịch vụ của bạn như dưới đây và kiểm tra một lần:

import { Http } from '@angular/http'; 
@Injectable() 
export class AuthService { 
    constructor(private http: Http) { 
    } 
    ... 
} 
+0

Cảm ơn bạn đã trả lời nhanh chóng, tuy nhiên, tôi vẫn gặp vấn đề tương tự. –

+0

Bản chỉnh sửa cũng không hoạt động. Khi biên dịch AuthService mới, hàm tạo vẫn cần 1 Đối số (trong js đã biên dịch và tệp d.ts). Nhưng vì nó hoạt động khi tôi điều chỉnh tệp định nghĩa, tôi đoán rằng mọi thứ hoạt động tốt ở phía JS. Phải có điều gì đó sai trái trong cách tôi tiêm nó. –

8

Bạn cần phải thay đổi cách thức, làm thế nào bạn xác định nhà cung cấp :

@NgModule({ 
    ... 
    providers: [ 
    Http, 
    { 
     provide: AuthService, 
     useFactory: getAuthService, 
     deps: [Http] 
    } 
    ] 
}) 

Phần cuối cùng là chức năng của nhà máy:

export function getAuthService(http: Http): LoggingService { 
    return new AuthService(http); 
} 

Xem thêm Migrating to Ionic 2 RC 0 - ngc fails

1

tôi đã cùng một vấn đề & Markus đưa tôi đi đúng hướng nhưng đây là những gì tôi cần phải làm gì để có được đi (xem thêm "Nhà cung cấp Nhà máy" dưới Angular docs Dependency Injection):

Thực hiện tham số hàm tạo trong dịch vụ được tiêm tùy chọn. Điều này một mình là không đủ (http được undefined khi chạy)

constructor(public http?: Http){} 

Tạo cung cấp dịch vụ SomeServiceProvider.ts lớp:

import { Http } from '@angular/http'; 
import { SomeService } from 'some-service'; 

export function someServiceFactory(http: Http){ 
    return new SomeService(http); 
} 

export let SomeServiceProvider = 
    { provide: SomeService, 
    useFactory: someServiceFactory, 
    deps: [ Http ] 
    }; 

Trong app.component gốc.ts, thêm nhà cung cấp dịch vụ:

@Component({ 
    ... 
    providers: [ SomeServiceProvider ] 
}) 

Di các dịch vụ từ các nhà cung cấp @NgModule trong app.module.ts.

Để sử dụng dịch vụ trong thành phần, có được nó từ Injector hơn là tiêm dịch vụ:

import { Component, Injector } from '@angular/core'; 
import { SomeService } from 'some-service'; 

@Component({ 
    ... 
}) 

export class MyComponent{ 
    someService: SomeService = this.injector.get(SomeService); 

    constructor(private injector: Injector) {} 

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