2016-11-07 41 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将其删除 –