@Input()
バインドプロパティsrcを持つimg-popコンポーネントを作成しました。 @HostBinding()
プロパティsrcを持つauthSrcディレクティブを作成しました。
@Component({
selector: 'img-pop',
template: `<img [src]="src"/>
<div *ngIf="isShow">
<----extra value----->
</div>`
})
export class ImgPopOverComponent implements OnInit {
@Input()
private src;
private isShow=false;
@HostListener('mouseenter') onMouseEnter() {
this.isShow= true;
}
@HostListener('mouseleave') onMouseLeave() {
this.isShow= false;
}
}
私はこのような指令を持っています。
@Directive({ selector: '[authSrc]' })
export class AuthSrcDirective implements OnInit {
@HostBinding()
private src: string;
constructor(private element: ElementRef) { }
ngOnInit() { }
@Input()
set authSrc(src) {
this.src = src+"?access_token=<-token->";
}
}
両方の機能を1つのように組み合わせたいです。
<img-pop [authSrc]="/api/url/to/image"></img-pop>
最終的なURL呼び出しは/ api/url/to/image?access_token = <-token->になります。
しかし、それはCan't bind to 'src' since it isn't a known property of 'img-pop'.
エラーをスローします
概念が間違っている場合は訂正してください。
ありがとうございました。
この回答 によると、コアコントリビューターによると、@HostBinding
を使用してコンポーネントの直接プロパティを設定することは不可能です。 @HostBinding
は常にDOMに直接バインドします。したがって、これは仕様によるものです。説明は次のとおりです。
これは、次のように意図したとおりに機能します。
- 同じ要素上のディレクティブ/コンポーネント間で通信するためにデータバインディングを使用すると、一方が他方のデータを注入することによる直接通信よりも遅くなります
- ディレクティブ間のバインドは、簡単にサイクルにつながります。
したがって、あなたの場合、これは可能な解決策です:
export class AuthSrcDirective {
// inject Host component
constructor(private c: ImgPopOverComponent ) { }
@Input()
set authSrc(src) {
// write the property directly
this.c.src = src + "?access_token=<-token->";
}
}
より一般的なアプローチについては、 this を参照してください。
ディレクティブは、コンポーネントテンプレートに静的に追加されるHTMLに一致するセレクターに対してのみインスタンス化されます。
要素からディレクティブを動的に追加/削除する方法はありません。唯一の方法は、要素全体を追加/削除することです(たとえば、*ngIf
を使用します)。