2016-11-07 27 views
7

Poszukuję najlepszego sposobu obsługi HostBinding z wartością asynchroniczną.Async HostBinding w dyrektywie

Przed Kątowymi v2.1.2 mogę użyć właściwości host w @Directive dekorator tak:

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

Ale wygląda na to, to nie było zamierzone zachowanie, od wersji 2.1.2 rozwiązuje problem. Zobacz don't access view local variables nor pipes in host expressions.

Teraz, podczas kompilacji z kompilacją AoT, otrzymuję Parser Error: Host binding expression cannot contain pipes in Directive.

+0

Co gospodarz nieruchomość starasz się wiązać? Czy możesz podać kod elementu hosta? –

+0

Element hosta jest rodzimym ''. Chcę, aby 'MyDirective' asynchronicznie wiązał wartość obserwowalnej właściwości' alt' z atrybutem 'alt' img. –

+1

"... nigdy nie chcieliśmy mieć potoków w połączeniach hosta." Źródło: [Async Host Binding No longerer Works 12671] (https://github.com/angular/angular/issues/12671#issuecomment-258168242) Więc powinieneś znaleźć inny sposób, aby to zrobić, lub zaktualizuj swoje pytanie. –

Odpowiedz

3

Tobias Bosch (członek Kątowymi zespół) pisze:

powiązania gospodarzem składnika („dziecko”) są realizowane w komponencie który używa ten składnik ("rodzic"). A składnik macierzysty może należy do innego modułu NgModule. Więc jeśli używasz rury, rura jest rozwiązana względem modułu NgModuł komponentu nadrzędnego. Jednakże, jeśli , że NgModule nie deklaruje rury, której używasz, Twój komponent jest uszkodzony.

To jest powód, dla którego nigdy nie chcieliśmy mieć potoków w połączeniach hosta. Po jednym z większych refaktoryzacji kompilatora przed 2.0 final, my przypadkowo przywróciliśmy go, ale był to błąd, a nie funkcja, ponieważ semantyka jest błędna.

Źródło:

Async Host Binding No Longer Works #12671

1

Jestem pewien, że nie ma na to specjalnego sposobu. Trzeba jednoznacznie przypisać do nieruchomości

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

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

To jest sposób, w jaki robię to teraz. Miałem jednak nadzieję, że nadal będziemy mogli używać 'AsyncPipe', ponieważ robi to bardziej po prostu' subscribe'. Ale dziękuję :) –

+0

Rury poza szablonem nigdy nie miały działać. (być może w niektórych czasach pre-beta). Odkryłem, że to zadziwiające, że działało do niedawna. –

+0

Nigdy nie próbowałem go przed v2.1.0, a następnie v2.1.2 usuwa go –