2013-11-21 4 views
7

के साथ एंगुलरजेएस सेवा में निर्भरता इंजेक्शन के लिए सर्वश्रेष्ठ अभ्यास मुझे टाइपस्क्रिप्ट में एंगुलरजेएस सेवाओं के लिए निर्भरता इंजेक्शन कुछ हद तक बोझिल लगता है। वर्तमान में, मैं अपने सेवा वर्ग के भीतर एक कारखाने विधि को परिभाषित है, और सभी निर्भरता इंजेक्शन तर्क दोहराना तीन बार:टाइपस्क्रिप्ट

class MyService { 
    public static Factory($rootScope, myController) {  // 1st time 
     return new MyService($rootScope, myController);  // 2nd time 
    } 
    constructor(public $rootScope, public myController) {} // 3rd time 
} 
myModule.factory('myService', MyService.Factory); 

मैं निम्नलिखित करना चाहते हैं, लेकिन वह काम करने के लिए प्रतीत नहीं होता:

class MyService { 
    constructor(public $rootScope, public myController) {} // only once 
} 
myModule.factory('myService', MyService); 

यह दृष्टिकोण नियंत्रकों के लिए ठीक काम करता है, लेकिन सेवाओं के लिए नहीं। क्या कोई बेहतर तरीका है?

अग्रिम धन्यवाद!

उत्तर

1

आप फ़ैक्टरी विधि रखने के बजाय अपने नियंत्रक को बनाने के लिए केवल कोणीय इंजेक्टर का उपयोग कर सकते हैं। http://jsfiddle.net/UPv5j/3/

6

आप उपयोगकर्ता servicefactory नहीं करना चाहिए:

यहाँ यह काम करता है टाइपप्रति

/// <reference path='d.ts/DefinitelyTyped/angularjs/angular.d.ts' /> 

class MyCtrl { 
    public phrase: string; 
    constructor($window) { 
    this.phrase = 'I was loaded by injector'; 
    } 

    speak() { 
    alert(this.phrase); 
    } 
} 

function main() { 
    var injector = angular.injector(['ng']); 
    var ctrl = injector.instantiate(MyCtrl); 
    ctrl.speak(); 
} 

में एक नमूना और साबित करने के लिए एक Fiddler है

class MyService { 
    constructor(public $rootScope) {} // only once 
} 
myModule.service('myService', MyService); 
+1

भी ध्यान दें कि 'myModule.service ('myService', MyService); ' * कक्षा घोषणा के बाद * जाना चाहिए। इसे पहले रखने से कोड संकलन हो जाएगा लेकिन रनटाइम में त्रुटियां उत्पन्न हो सकती हैं (कुछ अपरिभाषित प्रोटोटाइप तक पहुंचने जैसी)। –