2016-10-03 9 views
10

मैं अपने Ionic2.beta11 ऐप को नए Ionic2.rc0 रिलीज पर पोर्ट करने का प्रयास कर रहा हूं। ज्यादातर चीजें बहुत सीधे आगे थीं, लेकिन मुझे एओटी कंपाइलर के साथ समस्या है।Ionic2/Angular2 में प्रदाता कन्स्ट्रक्टर को तर्क कैसे दे सकता हूं?

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

मैं src/app/app.module.ts फ़ाइल में अपने ऐप्स में यह इंजेक्शन लगाने कर रहा हूँ:

मैं एक AuthService है

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

सब कुछ ठीक काम करता है जब आयनिक चल सेवा करते हैं, लेकिन जब मैं बनाने की कोशिश मुझे निम्न त्रुटि मिलती है:

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

लाइन्स 396 - 39 9:

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

समस्या यह है कि new import44.AuthService() प्रकार http के तर्क की अपेक्षा करता है।

दिलचस्प बात यह है कि जब मैं मैन्युअल रूप से constructor(http: Http) को constructor() परिभाषा फ़ाइल में बदलता हूं तो सब कुछ ठीक काम करता है।

मैं उन सभी स्टैक ओवरफ्लो उत्तरों के माध्यम से पढ़ता हूं जो मुझे मिल सकता था, लेकिन समाधानों में से कोई भी मेरी समस्या का हल नहीं हुआ।

क्या मुझे AuthService में कन्स्ट्रक्टर को बदलने की ज़रूरत है या जिस तरह से मैं इसे अपने ऐप में इंजेक्ट करता हूं? आपके सहयोग के लिए धन्यवाद।

+0

एक अस्थायी समाधान मैं तर्क वैकल्पिक बना दिया के रूप में और अब यह काम करता है। लेकिन मैं अभी भी एक उचित समाधान की तलाश में हूं। –

उत्तर

0

आयात HttpModule अपने अनुप्रयोग मॉड्यूल में @angular/http से नीचे के रूप में:

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

नीचे के रूप में अपनी सेवा को बदलें और एक बार जाँच:

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

आपके त्वरित उत्तर के लिए धन्यवाद, हालांकि, मुझे अभी भी वही समस्या मिल रही है। –

+0

संपादन भी काम नहीं किया। नई AuthService संकलित करते समय, कन्स्ट्रक्टर को अभी भी 1 तर्क (संकलित जेएस और d.ts फ़ाइल में) की आवश्यकता है। लेकिन जब मैं परिभाषा फ़ाइल को समायोजित करता हूं तो यह काम कर रहा है, मुझे लगता है कि सब कुछ जेएस पक्ष पर ठीक काम करता है। जिस तरह से मैं इंजेक्ट करता हूं उसमें कुछ गड़बड़ होनी चाहिए। –

8

आप प्रदाता कैसे परिभाषित तरीका बदलना होगा, :

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

अंतिम टुकड़ा कारखाना कार्य है:

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

भी देखें Migrating to Ionic 2 RC 0 - ngc fails

1

मैं एक ही मुद्दा & मार्कस मुझे सही रास्ते पर डाल दिया था, लेकिन यहाँ क्या मैं जा रहा प्राप्त करने के लिए (Angular docs Dependency Injection के तहत भी "फैक्टरी प्रदाता" देखें) करने के लिए की जरूरत है:

इंजेक्शन सेवा वैकल्पिक में कन्स्ट्रक्टर पैरामीटर बनाएं।

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 ] 
    }; 

जड़ app.component में: यह अकेला (http कार्यावधि में अपरिभाषित था)

constructor(public http?: Http){} 

एक सेवा प्रदाता वर्ग SomeServiceProvider.ts बनाएं पर्याप्त नहीं है।ts, सेवा प्रदाता जोड़ें:

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

app.module.ts में @NgModule प्रदाताओं से सेवा निकालें।

घटकों में सेवा का उपयोग करने के लिए, बल्कि सेवा इंजेक्शन लगाने से इंजेक्टर से इसे पाने:

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) {} 

} 
संबंधित मुद्दे