私は現在、3行以上の長さのテキストを切り詰めるカスタムディレクティブを持っています。今はテキスト自体を直接クリックすると機能しますが、ボタンにクリックイベントを割り当てたいと思います。これは私の現在のコードです:ディレクティブの外側の要素にクリックイベントを割り当てるにはどうすればよいですか?
@Directive({
selector: '[appReadMore]'
})
export class ReadMoreDirective {
constructor() { }
@HostBinding('class.truncate-text') get opened() {
return this.isClosed;
}
@HostListener('click') open() {
this.isClosed = (this.isClosed === true ? false : true);
}
private isClosed = true;
}
私は私のhtmlファイルで:
<div class="container" *ngFor="let book of books">
<div>
<p appReadMore>
{{Text 1}}
</p>
<p appReadMore>
{{Text 2}}
</p>
</div>
<div>
<button appReadMoreTrigger>Read more</button>
</div>
</div>
と私のCSS:
.truncate-text {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
}
私はtruncate-text
クラスがあり、個々の<p>
コンテンツをクリックすると1クリックおきに適用され、削除されましたが、[詳細を読む]ボタンをクリックすると、両方とも<p>
タグが発生します。
@Directive({
selector: '[appReadMoreTrigger]',
})
export class ReadMoreTriggerDirective{
constructor(private readMore:ReadMoreDirective) {}
@HostListener('click') open() {
this.readMore.open();
}
}
これを試してみますと、「No appReadMoreDirectiveのプロバイダがありません」というエラーが表示され、プロバイダのリストに追加すると、新しいReadMoreDirectiveインスタンスが作成されたようです。
おかげ
@isherwoodを私は他のディレクティブと、それは私のために働いていなかった理由の小さな説明を追加しました。 ReadMoreTriggerDirectiveの親divにReadMoreDirectiveを設定しても動作しますが、この場合はdivの兄弟です。 – Xenohs
DOMに 'ReadMoreTriggerDirective'をどこにどのように追加しますか?あなたのコードのどこにでも 'appReadMoreTrigger'(ディレクティブのセレクタ)が見つかりません。 –
@GünterZöchbauer申し訳ありません私は上記のコードに再追加するのを忘れました。 appReadMoreTriggerセレクターをボタンに追加しました。 – Xenohs