2015-06-16 18 views
6

का उपयोग कर मैं एक साधारण कोणीय निर्देश है कि इस तरह दिखता है का कहना है कि चलो AngularJS निर्देश के लिए निर्भरता सम्मिलित करें? मेरे उदाहरण कुछ इस तरह दिखेगा:टाइपप्रति

/// <reference path="../../reference.ts"/> 

class SetFocus{ 
    constructor() { 
     var directive: ng.IDirective = {}; 
     directive.restrict = 'EA'; 
     directive.scope = { };   
     directive.link= function ($scope, $element, $attrs) { 
     // How can I access $timeout here? 

     } 
     return directive; 
    } 
} 

directives.directive('setFocus', [SetFocus]); 

यह एक मूर्खतापूर्ण उदाहरण हो सकता है, लेकिन यह सिद्धांत मैं काम कर पाने के लिए है, जो कोणीय लिंक समारोह में इंजेक्शन निर्भरता उपयोग कर रहा है चाहते हैं।

class SetFocus implements ng.IDirective { 
    //Directive settings 
    restrict :string = 'EA'; 
    scope : any= {}; 
    //Take timeout argument in the constructor 
    constructor(private $timeout: ng.ITimeoutService) { 
    } 

    link: ng.IDirectiveLinkFn = ($scope: ng.IScope, $element: ng.IAugmentedJQuery, $attrs: ng.IAttributes) => { 
      //refer to the timeout 
      this.$timeout(function() { 
      $element[0].focus(); 
     }, 0); 
    } 
    //Expose a static func so that it can be used to register directive. 
    static factory(): ng.IDirectiveFactory { 
     //Create factory function which when invoked with dependencies by 
     //angular will return newed up instance passing the timeout argument 
     var directive: ng.IDirectiveFactory = 
       ($timeout:ng.ITimeoutService) => new SetFocus($timeout); 
     //directive's injection list 
     directive.$inject = ["$timeout"]; 
     return directive; 
    } 
} 

directives.directive('setFocus', SetFocus.factory()); 

यह जिस तरह से आप यह अभी के साथ एक समस्या हो सकती है:

उत्तर

9

इस तरह की कोशिश करो। चूंकि निर्देशक फैक्ट्री को नया नहीं किया गया है, इसलिए इसका कन्स्ट्रक्टर this के साथ वैश्विक ऑब्जेक्ट के रूप में निष्पादित करेगा। इस तरह आप एक विशाल कन्स्ट्रक्टर के साथ भी समाप्त नहीं होते हैं और इसे उचित कक्षा आईई तरीके से लिख सकते हैं।

आप कई निर्भरता के बजाय कारखाने में तर्क दोहराने की इंजेक्ट किया है, तो आप के रूप में अच्छी कर सकता है:

var directive: ng.IDirectiveFactory = 
      (...args) => new (SetFocus.bind.apply(SetFocus, [null].concat(args))); 
1

सभी कारखाने बॉयलरप्लेट (और निर्माता सरणी सभी) से बचने के लिए, मैं हाल ही में लिखा था एक छोटा सा पुस्तकालय, कि निर्देशों की परिभाषा बहुत ही सरल बनाने (नियंत्रक और टेम्पलेट यहां छोड़े गए) (वर्तमान में एक परीक्षण परियोजना के रूप में):

@Directive('userRank') 
export class UserRankDirective implements ng.IDirective { 

    controller = UserRankDirectiveController; 
    restrict = 'A'; 
    template = template; 
    //controllerAs: 'ctrl', set as default 
    replace = true; 
    scope = { 
     user: '=userRank' 
    } 

    constructor($q: ng.IQService) { 
     console.log('Q service in UserRankDirective:', $q); 
    } 

} 

यह सज्जाकार @Directive की तरह उपयोग करता है और टाइपप्रति संकलक कि मीटर का अनुकूलित संस्करण एके इंटरफेस मेटाडाटा रनटाइम पर उपलब्ध है (इसलिए ng.IQService का अनुवाद '$q' पर किया जा सकता है और कन्स्ट्रक्टर सरणी में इंजेक्शन दिया जा सकता है)। कोई और app.directive(...) बॉयलरप्लेट: सब कुछ सजावटी में किया जाता है :) आप नमूना आवेदन कोड here

पर एक नज़र डाल सकते हैं