如何以编程方式为 d3 元素打开 ngbootstrap popover?
How to programmatically open ngbootstrap popover for a d3 element?
我想为 D3 元素打开鼠标悬停弹出窗口。
基本上这意味着我的 component.html 文件几乎是空的,只包含弹出框模板:
<ng-template #popContent let-greeting="greeting">{{greeting}}, <b>{{name}}</b>!</ng-template>
我不能使用通常的
[ngbPopover]="popContent" popoverTitle="Greeting" #p="ngbPopover" triggers="manual"
属性,因为目标 D3 元素尚不存在
我需要的是能够以某种方式调用 popover 的 open 函数并传递 popover 的内容和位置。
在我的组件中是这样的:
public showPopover(node, text){ // node is the DOM element for which to show popover
... what should go here? ...
}
API 似乎没有提供在 dynamic elements 上创建弹出窗口的方法(请参阅容器)。由于 angular 希望您避免直接访问 DOM,您必须通过模板创建弹出窗口。因此,我会在 "blank" 元素上创建它,然后将其移动到您的动态元素。也就是说,一旦你移动它,你就必须手动触发它,因为 events 将全部在 "blank" 元素上。像这样:
模板
<!-- empty span to create the popover on -->
<!-- note the "manual" trigger -->
<span ngbPopover="Vivamus sagittis lacus vel augue laoreet rutrum faucibus." popoverTitle="Popover on top"
#popover="ngbPopover" triggers="manual">
</span>
<div #base></div> <!-- where my dynamic element will go -->
控制器
import {NgbPopover} from '@ng-bootstrap/ng-bootstrap';
import {Component, ViewChild, ngAfterViewInit, ElementRef, Renderer2} from '@angular/core';
@Component({
selector: 'ngbd-popover-tplwithcontext',
templateUrl: 'src/popover-tplwithcontext.html'
})
export class NgbdPopoverTplwithcontext implements ngAfterViewInit {
@ViewChild('popover') public popover: NgbPopover;
@ViewChild('base') el:ElementRef;
ngAfterViewInit(){
// create dynamic element
let s = d3.select(this.el.nativeElement)
.append('button')
.html('Dynamically Added!')
// manual open
.on('click', () => { this.openPop(); })
// assign popover our new element
this.popover._elementRef = new ElementRef(s.node());
}
// handle the opening/closing
public openPop(): void {
console.log(this)
this.popover.isOpen() ? this.popover.close() : this.popover.open();
}
}
这里是running example.
嗨,它很有用,谢谢,但我必须添加一个东西,你需要在定义文件 popover.d.ts[= 中将 属性“.elementRef”更改为 public 11=]
export declare class NgbPopover implements OnInit, OnDestroy, OnChanges {
public _elementRef;
我想为 D3 元素打开鼠标悬停弹出窗口。
基本上这意味着我的 component.html 文件几乎是空的,只包含弹出框模板:
<ng-template #popContent let-greeting="greeting">{{greeting}}, <b>{{name}}</b>!</ng-template>
我不能使用通常的
[ngbPopover]="popContent" popoverTitle="Greeting" #p="ngbPopover" triggers="manual"
属性,因为目标 D3 元素尚不存在
我需要的是能够以某种方式调用 popover 的 open 函数并传递 popover 的内容和位置。 在我的组件中是这样的:
public showPopover(node, text){ // node is the DOM element for which to show popover
... what should go here? ...
}
API 似乎没有提供在 dynamic elements 上创建弹出窗口的方法(请参阅容器)。由于 angular 希望您避免直接访问 DOM,您必须通过模板创建弹出窗口。因此,我会在 "blank" 元素上创建它,然后将其移动到您的动态元素。也就是说,一旦你移动它,你就必须手动触发它,因为 events 将全部在 "blank" 元素上。像这样:
模板
<!-- empty span to create the popover on -->
<!-- note the "manual" trigger -->
<span ngbPopover="Vivamus sagittis lacus vel augue laoreet rutrum faucibus." popoverTitle="Popover on top"
#popover="ngbPopover" triggers="manual">
</span>
<div #base></div> <!-- where my dynamic element will go -->
控制器
import {NgbPopover} from '@ng-bootstrap/ng-bootstrap';
import {Component, ViewChild, ngAfterViewInit, ElementRef, Renderer2} from '@angular/core';
@Component({
selector: 'ngbd-popover-tplwithcontext',
templateUrl: 'src/popover-tplwithcontext.html'
})
export class NgbdPopoverTplwithcontext implements ngAfterViewInit {
@ViewChild('popover') public popover: NgbPopover;
@ViewChild('base') el:ElementRef;
ngAfterViewInit(){
// create dynamic element
let s = d3.select(this.el.nativeElement)
.append('button')
.html('Dynamically Added!')
// manual open
.on('click', () => { this.openPop(); })
// assign popover our new element
this.popover._elementRef = new ElementRef(s.node());
}
// handle the opening/closing
public openPop(): void {
console.log(this)
this.popover.isOpen() ? this.popover.close() : this.popover.open();
}
}
这里是running example.
嗨,它很有用,谢谢,但我必须添加一个东西,你需要在定义文件 popover.d.ts[= 中将 属性“.elementRef”更改为 public 11=]
export declare class NgbPopover implements OnInit, OnDestroy, OnChanges {
public _elementRef;