2015-12-27 15 views
11

मैं Typescript साथ angular2 उपयोग कर रहा हूँ के दौरान इंजेक्शन नहीं किया जा रहा। मैं एक base class कि अन्य वर्गों द्वारा विरासत में मिला जा सकता है बनाने के लिए कोशिश कर रहा हूँ और आधार वर्ग के भीतर, एक सेवा इंजेक्ट किया जाता है। अब तक मुझे नहीं base class कि user class में inherited किया जा रहा है में सही ढंग से ajaxServiceinjected मिल सकती है। विशेष रूप से जब कोई उपयोगकर्ता तत्काल होता है, और save() विधि को user उदाहरण से कॉल किया जाता है, तो base class में निम्न पंक्ति: return _this._ajaxService.send(options);_ajaxService के बाद से काम नहीं करता है।Angular2 निर्भरता इंजेक्शन, सेवा वर्ग विरासत

यहाँ एक user class कि base class फैली हुई है:

import {Base} from '../utils/base'; 

export class User extends Base { 

    // properties 
    id = null; 
    email = null; 
    password = null; 
    first_name = null; 
    last_name = null; 

    constructor(source) { 
    _super.CopyProperties(source, this); 
    } 
} 

यहाँ base class है:

import {Component} from 'angular2/core'; 
import {AjaxService} from './ajax.service'; 

@Component({ 
    providers: [AjaxService] 
}) 

export class Base { 

    constructor(private _ajaxService: AjaxService) { } 

    // methods 
    public static CopyProperties(source:any, target:any):void { 
    for(var prop in source){ 
     if(target[prop] !== undefined){ 
      target[prop] = source[prop]; 
     } 
     else { 
      console.error("Cannot set undefined property: " + prop); 
     } 
    } 
    } 

    save(options) { 
    const _this = this; 
    return Promise.resolve() 
    .then(() => { 
     const className = _this.constructor.name 
          .toLowerCase() + 's'; 
     const options = { 
     data: JSON.stringify(_this), 
     url: className, 
     action: _this.id ? 'PATCH' : 'POST'; 
     }; 

     debugger; 
     return _this._ajaxService.send(options); 
    }); 
    } 
} 

यह ठीक काम करता है कि AjaxService को छोड़कर आधार वर्ग में इंजेक्शन नहीं जा रहा है। मुझे लगता है कि यह समझ में आता है क्योंकि उपयोगकर्ता को आधार नहीं दिया जा रहा है।

तो Base module में AjaxService का उपयोग कैसे कर सकता हूं जब 'बेस मॉड्यूल किसी अन्य वर्ग पर बढ़ाया जा रहा है?

मुझे लगता है कि जब मैं उपयोगकर्ता का दृष्टांत, उपयोगकर्ता कक्षा में निर्माता कहा जाता है लेकिन आधार वर्ग कि सेवा injects में निर्माता नहीं बुलाया जा रहा है।

यहाँ AjaxService है:

import {Injectable} from 'angular2/core'; 

@Injectable() 

export class AjaxService { 

    // methods 
    send(options) { 
    const endpoint = options.url || ""; 
    const action = options.action || "GET"; 
    const data = options.data || {}; 

    return new Promise((resolve,reject) => { 
     debugger; 
     $.ajax({ 
     url: 'http://localhost:3000' + endpoint, 
     headers: { 
      Authentication: "", 
      Accept: "application/vnd.app.v1", 
      "Content-Type": "application/json" 
     }, 
     data: data, 
     method: action 
     }) 
     .done((response) => { 
     debugger; 
     return resolve(response); 
     }) 
     .fail((err) => { 
     debugger; 
     return reject(err); 
     }); 
    }); 

    } 

} 
+0

जहां तक ​​मुझे पता है कि इंजेक्शनबेल (अजाक्स सेवा) को टीएस में 'इंजेक्टेबल() 'के साथ एनोटेट किया जाना चाहिए। –

+0

आप 'उपयोगकर्ता' कक्षा का उपयोग कहां करते हैं? क्या यह एक घटक है? क्या इसमें एक टेम्पलेट है? – yarons

उत्तर

2

कोणीय 2 में प्रत्येक वर्ग है कि आप सुई आप व्याख्या करना होगा। यदि यह घटक नहीं है, तो आपको इसे @Injectable() एनोटेशन के साथ एनोटेट करना होगा। यदि आप कक्षा को इंजेक्ट करते हैं जो पहले से ही अन्य कक्षा को इंजेक्ट करता है, तो आपको इसके लिए प्रदाता बनाना होगा।

import {Injectable} from 'angular2/core'; 
import {Base} from './base'; 
@Injectable() 
export class User extends Base { 
} 

मैं तुम्हारे लिए Plunker बनाया है, मैं आशा है कि यह आपकी समस्या का समाधान होगा:

http://plnkr.co/edit/p4o6w9GjWZWGfzA6cv41?p=preview

(सांत्वना उत्पादन पर देखने के)

पी एस। वादे

+0

मुझे लगता है कि आपको केवल उन सेवाओं में इंजेक्शन योग्य होना चाहिए जिन्हें आप अन्य घटकों में इंजेक्ट करना चाहते हैं? –

+0

हाँ, यह सच है। साथ ही, आपको घटक के लिए प्रदाताओं की सरणी में सेवा शामिल करने की आवश्यकता है। –

9

यह आधार में सेवाएं सुई ठीक है के बजाय प्रत्यक्ष का उपयोग करें, लेकिन आप भले ही उपयोगकर्ता वर्ग से उस में पारित करने के लिए की है। आप बेस से सेवा के वास्तविक तत्कालता का वारिस नहीं कर सकते हैं, इसलिए आपको इसे उपयोगकर्ता से बेस पर पास करना होगा। यह टाइपस्क्रिप्ट की सीमा नहीं है, बल्कि यह एक विशेषता है कि DI सामान्य रूप से कैसे काम करता है।

कुछ इस तरह:

class User extends Base 
    constructor(service: AjaxService) { 
     super(service); 
    } 

बेस आप के लिए सेवा instantiated हैं, तो आप नहीं उपयोगकर्ता से इन्स्टेन्शियशन को प्रभावित करने में सक्षम होगा। इससे डीआई समग्र के कई लाभों को अस्वीकार कर दिया जाएगा क्योंकि आप निर्भरता नियंत्रण को एक अलग घटक को सौंपकर नियंत्रण खो देंगे।

मैं समझता हूँ कि आप बेस में इस निर्दिष्ट करके कोड दोहराव को कम करने की कोशिश कर रहा हो सकता है, लेकिन इस डि के सिद्धांत के खिलाफ जाता है।

+0

उत्तर के लिए धन्यवाद। मैं कोड डुप्लिकेशन को कम करने की कोशिश कर रहा हूं लेकिन यह एक दुःस्वप्न होने जा रहा है ... –

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