ng-bootstrapのPopoverModuleを使用しています。ホバー時にポップアップを開くオプションがあります。私のポップアップには、別のページへのhrefリンクがあります。ポップオーバーのコンテンツにカーソルを合わせることができず、ポップオーバーが消えます。
TSコード:
import { PopoverModule} from 'ng-bootstrap';
imports: [PopoverModule.forRoot()]
HTMLコード:
<div container="body" placement="bottom" [popover]="popContent" triggers="mouseenter:mouseleave" popoverTitle="title">
誰かが私を助けてくれますか
CHECK WORKING STACKBLITZ
私はsticky-popover.directive.ts
この機能を実現するために使用できるを書きました:〜
import {
ElementRef,
Directive, Input, TemplateRef,
EventEmitter,
Renderer2,
Injector,
ComponentFactoryResolver,
ViewContainerRef,
NgZone,
OnInit,
OnDestroy,
Inject,
ChangeDetectorRef
} from '@angular/core';
import { DOCUMENT } from '@angular/common';
import { NgbPopover, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap';
@Directive({
selector: '[stickyPopover]',
exportAs: 'stickyPopover'
})
export class StickyPopoverDirective extends NgbPopover implements OnInit, OnDestroy {
@Input() stickyPopover: TemplateRef<any>;
popoverTitle: string;
placement: 'auto' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left-top' | 'left-bottom' | 'right-top' | 'right-bottom' | ('auto' | 'top' | 'bottom' | 'left' | 'right' | 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'left-top' | 'left-bottom' | 'right-top' | 'right-bottom')[];
triggers: string;
container: string;
ngpPopover: TemplateRef<any>;
canClosePopover: boolean;
toggle(): void {
super.toggle();
}
isOpen(): boolean {
return super.isOpen();
}
constructor(
private _elRef: ElementRef,
private _render: Renderer2,
injector: Injector,
componentFactoryResolver: ComponentFactoryResolver,
private viewContainerRef: ViewContainerRef,
config: NgbPopoverConfig,
ngZone: NgZone,
private changeRef: ChangeDetectorRef,
@Inject(DOCUMENT) _document: any) {
super(_elRef, _render, injector, componentFactoryResolver, viewContainerRef, config, ngZone, _document, changeRef);
this.triggers = 'manual';
this.popoverTitle = '';
this.container = 'body';
}
ngOnInit(): void {
super.ngOnInit();
this.ngbPopover = this.stickyPopover;
this._render.listen(this._elRef.nativeElement, 'mouseenter', () => {
this.canClosePopover = true;
this.open();
});
this._render.listen(this._elRef.nativeElement, 'mouseleave', (event: Event) => {
setTimeout(() => { if (this.canClosePopover) { this.close(); } }, 100);
});
this._render.listen(this._elRef.nativeElement, 'click', () => {
this.close();
});
}
ngOnDestroy(): void {
super.ngOnDestroy();
}
open() {
super.open();
setTimeout(() => {
const popover = window.document.querySelector('.popover');
this._render.listen(popover, 'mouseover', () => {
this.canClosePopover = false;
});
this._render.listen(popover, 'mouseout', () => {
this.canClosePopover = true;
setTimeout(() => { if (this.canClosePopover) { this.close(); } }, 0);
});
}, 0);
}
close() {
super.close();
}
}
component.html
カスタムディレクティブを使用して、を次のように変更します。〜
<ng-template #popTemplate id="commentPopover">
<div style="max-height: 6em;overflow: auto;" id="divPopover">
{{ comment }}
</div>
<a href="https://yourwebpage.com" target="_blank">Open your webpage</a>
</ng-template>
<span [stickyPopover]="popTemplate" placement="bottom" triggers="manual">
<i class="icon">Hover over me!</i>
</span>
ng-bootstrapのインストールと使用法も確認してください
これがお役に立てば幸いです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加