2016-10-04 1 views
0

HINWEIS: Ich verwende angula RC2Wie kann man von einem Dienst in Angular 2 auf eine Anweisung zugreifen?

Mein Ziel ist: zu einen Eigenschaftswert in der Richtlinie aus dem Dienst eingestellt

ich eine benutzerdefinierte Richtlinie einzurichten, die einen Dienst verwendet:

@Directive({ 
    selector: '[chooseFile]' 
}) 

@Injectable() 
export class ChooseFileDirective implements OnInit { 
    property1: number = 1; 

    constructor(private _element: ElementRef, private _uploadService: UploadFile) { } 

    ngOnInit() { 
    this._uploadService.foo(); 
    }  
} 

UploadService

@Injectable() 
export class UploadFile { 

    constructor(private _chooseFileDirective: ChooseFileDirective) {} 

    foo() { 
    // update variable on calling directive 
    _chooseFileDirective.property1++; 
    } 
} 

Der Fehler Ich erhalte:

Error: (SystemJS) Error: Can't resolve all parameters for UploadFile: (?)

Was habe ich versucht (single und alle zusammen):

  • hinzufügen @Injectable() Dekorateur in der Richtlinie
  • die Richtlinien für Anbieter hinzufügen in app.component
  • hinzufügen im Konstruktor des Service: @Inject (ChooseFileDirective) _chooseFileDirective: ChooseFileDirective

Antwort

1

Angular 2 erlaubt keine Injektion von Direktiven/Komponenten. Es wird ein Weg sein, auf den Dienst zu hören. Sie können eine EventEmitter repräsentieren zum Beispiel fileUploaded $ Ereignis erstellen, so in der Richtlinie Sie etwas tun können:

export class ChooseFileDirective implements OnInit { 
    property1: number = 1; 

    constructor(private _element: ElementRef, private _uploadService: UploadFile) { } 

    ngOnInit() { 
    this._uploadService.foo(); 
    this.fileUploaded$.subscribe(file => //do your stuff) 
    }  
} 
+0

Dank. sieht nach einer guten Lösung aus. Ich muss einige andere Sachen in der App umgestalten, dann werde ich das auch testen und die Antwort akzeptieren :) – dragonmnl

Verwandte Themen