2016-11-07 1 views
7

Ich bin auf der Suche nach der besten Möglichkeit, HostBinding mit Async-Wert zu behandeln.Async HostBinding in Direktive

Vor Angular v2.1.2 Ich konnte die host Eigenschaft im @Directive Dekorateur wie das verwenden:

@Directive({ 
    selector: 'img[my-directive]', 
    host : { 
     '[alt]' : "alt | async" 
    } 
}) 
export class MyDirective { 
    alt: Observable<string>; 
} 

Aber es sieht so nicht das beabsichtigte Verhalten war, seit der Version 2.1.2 korrigiert sie. Siehe don't access view local variables nor pipes in host expressions.

Jetzt, wenn kompilieren mit AoT Compilation, bekomme ich Parser Error: Host binding expression cannot contain pipes in Directive.

+0

Welche Host-Eigenschaft sind Sie zu binden versuchen? Können Sie uns den Code des Hostelements geben? –

+0

Das Hostelement ist ein natives ''. Ich möchte, dass "MyDirective" den Wert der beobachtbaren Eigenschaft "alt" asynchron an das Attribut "alt" img bindet. –

+1

"... wir wollten nie Rohre in Host-Bindungen haben." Quelle: [Async Host Binding funktioniert nicht mehr 12671] (https://github.com/angular/angular/issues/12671#issuecomment-258168242) Sie sollten also einen anderen Weg finden, dies zu tun, oder Ihre Frage aktualisieren. –

Antwort

3

Tobias Bosch (Mitglied des Angular-Team) explizit zuweisen schreibt:

Host-Bindungen einer Komponente ("Kind") in der Komponente ausgeführt werden , die verwendet diese Komponente ("Eltern"). Und die Elternkomponente kann zu einem anderen NgModule gehören. Wenn Sie also eine Pipe verwenden, wird die Pipe gegen das NgModule der übergeordneten Komponente aufgelöst. Wenn jedoch NgModule die von Ihnen verwendete Pipe nicht deklariert, ist Ihre Komponente defekt.

Dies ist der Grund, warum wir nie Rohre in Host-Bindungen haben wollten. Nach einem der größeren Compiler Refactorings vor 2.0 Finale, wir versehentlich wieder eingeführt, aber das war ein Fehler, kein Feature, wie die Semantik falsch sind.

Quelle:

Async Host Binding No Longer Works #12671

1

Ich bin sicher, dass es keine spezielle Möglichkeit gibt, es zu tun. Sie müssen die Eigenschaft

@Directive({ 
    selector: 'img[my-directive]', 
    host : { 
     '[alt]' : "alt" 
    } 
}) 
export class MyDirective { 
    alt: Observable<string>; 

    ngOnInit() { 
     this.altObservable.subscribe(val => this.alt = val) 
    } 
} 
+0

So mache ich es jetzt. Ich hatte jedoch gehofft, dass wir das 'AsyncPipe' noch verwenden könnten, weil es mehr als nur ein' subscribe' tut. Aber danke :) –

+0

Pipe außerhalb der Vorlage sollte nie funktionieren. (vielleicht in einigen Vor-Beta-Zeiten). Ich fand es interessant, dass es bis vor kurzem funktioniert hat. –

+0

Ich habe es noch nie zuvor probiert v2.1.0, dann v2.1.2 entfernt es –

Verwandte Themen