使用自定义的角度指令扩展ng-boostrap popover组件 [英] Extend ng-boostrap popover component with custom angular directive
问题描述
我想实现的目标是扩展ngbPopover指令并将所有这些特性包装在自定义指令中,而不是仅仅将它们包括在我的指令中就显示出来.
What i try to achieve is to extend ngbPopover directive and wrap in custom directive all this proeprties so instead of showing them just to include my directive.
例如,我正在像这样使用ngbpopover:
For example i am using ngbpopover like this:
<button
type="button"
class="btn btn-primary mb-4"
placement="right-top"
[ngbPopover]="popOver"
popoverClass="popover-custom"
#popOverRef="ngbPopover"
triggers="manual"
[autoClose]="false"
(click)="popOverRef.toggle()"
(hidden)="onPopoverClose(options)"
>
Standard Picker
</button>
<ng-template #popOver>
<popover [data]="options" [popover]="popOverRef"><popover>
</ng-template>
我最终的目标是拥有类似的东西:
My goal at the end is to have something like:
<button type="button" class="btn btn-primary mb-4" customDirective></button>
因此所有这些道具都将在customDirective中处理.试图将ngbPopoverDirective扩展为下面的代码,但是我很难用这种方法显示popover.这可行还是其他主意?
so all this props to be handled inside customDirective. Tried to extend ngbPopoverDirective as code below but i struggle to show popover with this approach. Is this doable or some other idea?
自定义指令:
import {
Directive,
ElementRef,
Renderer2,
Injector,
ComponentFactoryResolver,
ViewContainerRef,
NgZone,
Inject,
ChangeDetectorRef,
ApplicationRef,
Input,
OnInit,
} from '@angular/core';
import { NgbPopover, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap';
import { DOCUMENT } from '@angular/common';
@Directive({
selector: '[popover]'
})
export class PopoverDirective extends NgbPopover implements OnInit {
@Input()
popover: string;
config: NgbPopoverConfig = {
autoClose: false,
placement: 'right-top',
triggers: "manual",
container: 'body',
disablePopover: false,
popoverClass: 'popover-custom',
openDelay: 0,
closeDelay: 0
}
constructor(
_elementRef: ElementRef<HTMLElement>,
_renderer: Renderer2,
injector: Injector,
componentFactoryResolver: ComponentFactoryResolver,
viewContainerRef: ViewContainerRef,
config: NgbPopoverConfig,
_ngZone: NgZone,
@Inject(DOCUMENT) _document: any,
_changeDetector: ChangeDetectorRef,
applicationRef: ApplicationRef
) {
super(
_elementRef,
_renderer,
injector,
componentFactoryResolver,
viewContainerRef,
config,
_ngZone,
_document,
_changeDetector,
applicationRef
);
console.log("here");
}
ngOnInit() {
console.log("onInit")
}
}
推荐答案
好,终于弄清楚了,不确定为什么我以前的代码不起作用.无论如何,我成功地扩展了ngbPopover指令.在我的情况下,我希望弹出窗口在父按钮上打开,例如按钮,可以将其更改为悬停(鼠标)....等等.
Ok finally got this to work not sure why my previous code was not working. Anyway i succeed with extending ngbPopover directive. In my case i wanted popoup to be open on parent click for example button, this can be change to hover (mouseenter).... etc..
import {
ElementRef,
Directive,
Input,
TemplateRef,
EventEmitter,
Renderer2,
Injector,
ComponentFactoryResolver,
ViewContainerRef,
NgZone,
OnInit,
OnDestroy,
Inject,
ChangeDetectorRef,
ApplicationRef,
} from '@angular/core';
import { NgbPopover, NgbPopoverConfig } from '@ng-bootstrap/ng-bootstrap';
import { DOCUMENT } from '@angular/common';
@Directive({
selector: '[customPopover]',
exportAs: 'customPopover',
})
export class PopoverDirective extends NgbPopover implements OnInit {
@Input() customPopover: TemplateRef<any>;
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,
applicationRef: ApplicationRef
) {
super(
_elRef,
_render,
injector,
componentFactoryResolver,
viewContainerRef,
config,
ngZone,
_document,
changeRef,
applicationRef
);
this.triggers = 'manual';
this.popoverTitle = '';
this.container = 'body';
this.popoverClass = 'popover-custom';
this.autoClose = false;
}
ngOnInit(): void {
super.ngOnInit();
this.ngbPopover = this.customPopover;
// we need to listen on parent element click envet for example button
// and toggle popover
this._render.listen(this._elRef.nativeElement.parentNode, 'click', () => {
this.toggle();
});
}
ngOnDestroy(): void {
super.ngOnDestroy();
}
}
使用此指令的组件:
<ng-template #popTemplate>
<custom-content-comp [data]="test" [popover]="popOverRef"></custom-content-comp>
</ng-template>
<span [customPopover]="popTemplate" #popOverRef="customPopover" placement="right-top" triggers="manual">
<ng-content></ng-content>
</span>
对于popTemplate,我再次使用自定义组件,这可以是我们想要的任何字符串,也可以是自定义模板.
For popTemplate i am using again custom component this can be whatever we want either string either custom template.
用法:
<div class="col-3">
<br />
<button
type="button"
class="btn btn-primary mb-4"
customPopoverComp
>
Standard Picker
</button>
</div>
这篇关于使用自定义的角度指令扩展ng-boostrap popover组件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!