2016-11-07 34 views
7

我正在尋找處理具有異步值的HostBinding的最佳方法。指令中的異步HostBinding

V2.1.2之前,我可以在@Directive裝飾像使用host屬性:

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

但是看起來這不是預期的行爲,因爲2.1.2版修復它。見don't access view local variables nor pipes in host expressions

現在,在編譯AoT編譯時,我得到了Parser Error: Host binding expression cannot contain pipes in Directive

+0

什麼主機屬性是你想綁定到?你可以給我們的主機元素的代碼? –

+0

主機元素是本機「」。我希望'MyDirective'異步地將'alt'可觀察屬性的值綁定到'alt' img屬性。 –

+1

「......我們從不想在主機綁定中擁有管道。」來源:[異步主機綁定不再有效12671](https://github.com/angular/angular/issues/12671#issuecomment-258168242)所以你應該找到另一種方式來做到這一點,或更新你的問題。 –

回答

3

托比亞斯博世(對角隊的成員)寫道:

主機綁定組件(「子」)的在使用該組件 執行該組件(「父」)。而父組件可以是 屬於不同的NgModule。所以如果你使用管道,管道是 解決父組件的NgModule。但是,如果 NgModule沒有聲明您正在使用的管道,那麼您的 組件已損壞。

這就是爲什麼我們從不想在主機綁定中有管道的原因。 在2.0 final之前的一個更大的編譯器重構之後,我們 意外地重新引入了它,但這是一個錯誤,而不是一個特性,因爲 的語義錯誤。

來源:

Async Host Binding No Longer Works #12671

1

我確定沒有特殊的方法來做到這一點。你需要明確分配給屬性

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

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

這是我現在做的方式。不過,我希望我們仍然可以使用'AsyncPipe',因爲它更像是一個'subscribe'。但是,謝謝:) –

+0

模板外的管道從來沒有工作。 (也許在一些beta前時期)。我發現它直到最近纔有效果。 –

+0

我從未在v2.1.0之前嘗試過,然後v2.1.2將其刪除 –