2015-12-24 10 views
9

टिप्पणी - मैं इस समस्या को हल करने के लिए, इस पोस्टकोणीय 2.0 - इंजेक्ट Http सेवा अपरिभाषित है

मैं UpgradeAdapter (ngUpgrade) का उपयोग कर मेरी कोणीय 1.x आवेदन उन्नयन कर रहा हूँ के तल में देखने में कामयाब रहे। मैं एक नया कोणीय 2.0 सेवा है जो मैं अपने कोणीय 2.0 घटक से कॉल कहा:

सेवा:

import {Inject} from 'angular2/core'; 
import {Http} from 'angular2/http'; 
import {Observable} from 'rxjs/Observable'; 

export default class MyService { 
    _http; 
    constructor(http: Http) { 
    this._http = http; //http is undefined here 
    } 

    getData(): Observable<any> { 
    return this._http.get(someUrl); 
    } 
} 

अंदर मेरी bootstrap.ts मेरे पास है:

declare var angular: any; 

import {UpgradeAdapter} from 'angular2/upgrade'; 
import {Http} from 'angular2/http'; 

let adapter = new UpgradeAdapter(); 

adapter.addProvider(Http); 

//..... 

adapter.bootstrap(document.body, ['myApp']); 

क्या मैं गलत यहाँ कर रहा हूँ?

संपादित:

मैं अपने कोणीय 2.0 सेवा के लिए एक और सेवा (कोणीय 1.x के लिए उन्नत सेवा) इंजेक्शन रहा हूँ, और यह काम करता है:

import {Inject} from 'angular2/core'; 
import {Http} from 'angular2/http'; 
import {Observable} from 'rxjs/Observable'; 

export default class MyService { 
    _http; 
    _dataService; 
    constructor(@Inject('dataService') dataService, http: Http) { 
    this._http = http; //http is undefined here 
    this._dataService = dataService; //dataService is defined!! 
    } 

    getData(): Observable<any> { 
    return this._http.get(someUrl); 
    } 
} 

Bootstrap.ts:

declare var angular: any; 

import {UpgradeAdapter} from 'angular2/upgrade'; 
import {Http} from 'angular2/http'; 

let adapter = new UpgradeAdapter(); 

adapter.addProvider(Http); 

adapter.upgradeNg1Provider('dataService'); 

adapter.bootstrap(document.body, ['myApp']); 

EDIT 2:

करने के लिए कोई http इंजेक्शन -

MyService = __decorate([ 
     core_1.Injectable(), 
     __param(0, core_1.Inject('dataService')) 
    ], MyService); 
    return MyService; 

आप देख सकते हैं:

जब मेरे ES5 को देखकर मैं इस कोड पाया कोड मालूम। समस्या के लिए

Error: No provider for Http! 

समाधान:: जब इस वाक्य विन्यास का उपयोग करने के लिए अपने सेवा निर्माता बदलते

constructor(@Inject('dataService') dataService, @Inject('Http') http) 

अब मैं निम्न त्रुटि हो रही है

तो मैं अंत में सफल होते हैं तो एक सुराग का उपयोग कर @PierreDuc प्रतिक्रिया से:

मैंने MyService के लिए निर्माता को बदल दिया:

constructor(@Inject('dataService') dataService, @Inject(Http) http) 

और मैं अपने घटक के लिए एक प्रदाता (जो सेवा का उपयोग करता) के रूप में HTTP_PROVIDERS कहा: (मेरी एनजी 2 घटक :)

providers: [MyService, HTTP_PROVIDERS]

@Injectable या addProvider मेरी बूटस्ट्रैप के अंदर के लिए कोई ज़रूरत नहीं के अंदर ।

मुझे पूरी तरह से समझ में नहीं आ रहा है कि यह क्यों हो रहा है और यह समाधान क्यों काम करता है। अगर कोई इसे यहां जानता है तो इसे समझाएगा।

समाधान संपादित करें:

एक छोटे से पढ़ने के बाद, मैं अब डि बेहतर समझते हैं।मैं प्रत्येक घटक के लिए प्रदाता को परिभाषित करने के बजाय addProvider(HTTP_PROVIDERS) का उपयोग कर सकता हूं (यह सभी घटकों के लिए उपलब्ध होगा)। एकमात्र रहस्य छोड़ दिया गया है क्यों private http: Http इंजेक्शन क्यों काम नहीं करता है जबकि @Inject(Http) http काम करता है। कोई उपाय???

+0

के लिए यह प्रयास _So मैं अंत में सफल होते हैं तो @PierreDuc response_ से एक सुराग का उपयोग कर, तो आप शायद उन्हें कुछ श्रेय उस मामले में देना चाहिए :) – christiandev

+0

मैंने किया था! लेकिन यह इस मुद्दे का समाधान नहीं है, इसलिए मैं इसे उत्तर के रूप में चिह्नित नहीं कर सकता क्योंकि यह जवाब नहीं था ... –

+0

मुझे पार्टी के लिए देर हो चुकी है, लेकिन अन्य भविष्य के पाठकों के लिए ... "यह एक" सर्वश्रेष्ठ है अभ्यास "@ इंजेक्शन योग्य() सजावट [अपनी सभी सेवाओं के लिए] दोनों को स्थिरता और भावी-प्रमाणन के लिए शुरूआत से लागू करने के लिए" - [सेवा ट्यूटोरियल] (https://angular.io/docs/ts/ नवीनतम/ट्यूटोरियल/तो-pt4.html)। –

उत्तर

4

आपको बूटस्ट्रैप में HTTP_PROVIDERS जोड़ना चाहिए, न केवल Http। के लिए bootstrap.ts

declare var angular: any; 

import {UpgradeAdapter} from 'angular2/upgrade'; 
import {HTTP_PROVIDERS} from 'angular2/http'; 

let adapter = new UpgradeAdapter(); 

adapter.addProvider(HTTP_PROVIDERS); 

//..... 

adapter.bootstrap(document.body, ['myApp']); 

संपादित

इस प्रयास करें और उस MyService.ts ऊपर जाने के लिए कोणीय पता है कि यह अपनी निर्भरता इंजेक्षन करना पड़ता है एक @Injectable() डेकोरेटर होना आवश्यक है। dataService के इंजेक्शन का कारण यह है कि आपने सजावटी @Inject का उपयोग किया था। MyService.ts

import {Injectable} from 'angular2/core'; 
import {Http} from 'angular2/http'; 
import {Observable} from 'rxjs/Observable'; 

@Injectable() 
export default class MyService { 

    constructor(private _http: Http) {} 

    getData(): Observable<any> { 
    return this._http.get(someUrl); 
    } 
} 
+0

यह मदद नहीं की ... अभी भी अपरिभाषित ... –

+1

आह हाँ, आप एक और बात भूल गए। मैं अपना उत्तर – PierreDuc

+0

संपादित कर दूंगा क्षमा करें, पहले से ही यह कोशिश की गई है - अभी भी किसी भी नेटवर्क/कंसोल त्रुटियों के बिना –

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