【问题标题】:ngx-bootstrap popover is not working properlyngx-bootstrap 弹出框无法正常工作
【发布时间】:2019-08-31 22:58:24
【问题描述】:

我正在使用ngx-bootstrap popover。我希望弹出窗口应该在悬停时打开,如果打开新的,所有打开的都应该关闭。

working example

根据要求,我希望上面的示例应由父组件控制,目标弹出框位于子组件中。我需要这个来满足模块化要求

Demo ngFor in child component html 这是错误的演示

Updated demo ngFor 在父组件html中

父组件

export class DemoPopoverFourDirectionsComponent  implements 

AfterViewInit{
  @ViewChildren(PopoverDirective) popovers: QueryList<PopoverDirective>;

  ngAfterViewInit() {
    this.popovers.forEach((popover: PopoverDirective) => {
      popover.onShown.subscribe(() => {
        this.popovers
        .filter(p => p !== popover)
        .forEach(p => p.hide());
      });
    });
  }

varArr=[1,2,3,4]

}

在弹出窗口中有需要点击的按钮。如果我使用 triggers="mouseenter:mouseleave" 我无法点击弹出框内的按钮

【问题讨论】:

    标签: angular ngx-bootstrap


    【解决方案1】:

    我更改了你的代码,希望它是你需要的

    here

    更新

    here is the final code

    【讨论】:

    • 谢谢你的代码在演示/示例程序中工作,但在我的实际情况下它不起作用。不同之处在于子组件从 API 获取数据并且存在某种延迟。这可能是原因。
    • ngAfterViewInit() { this.popovers.forEach((popover: PopoverDirective) =&gt; { popover.onShown.subscribe(() =&gt; { this.popovers .filter(p =&gt; p !== popover) .forEach(p =&gt; p.hide()); console.log(popover) //demo shows in demo, but in my actual code it doesn't }); }); }
    • 将 this.popovers.foreach... 移到 this.popovers=(items);也许这会解决它
    • 感谢帮助控制台显示日志,但无法正常工作,角度版本为 6.1.10,ngx-bootstrap 版本为 3.3.0。这种变化是否会导致问题
    • 不,问题不相关。尝试添加 this.onFinish.emit(this.popovers);从服务器读取数据后在您的子组件中
    【解决方案2】:

    只需设置triggers="mouseenter:mouseleave"

    见:https://ng-bootstrap.github.io/#/components/popover/examples#triggers

    更新:

    由于新的要求,这里是一个更改的版本,它关闭了一个旧的弹出窗口,让我们点击里面的一个按钮:

    HTML

    <div *ngFor="let d of varArr; let i = index">
        <button type="button" class="btn btn-default btn-secondary"      
              #pop="bs-popover"
              [popover]="popover"
              popoverTitle="Popover on top"          
              placement="right" triggers="mouseenter"          
              (onShown)="closeOldPopover(pop)"
              [outsideClick]="true">
        Popover on top
      </button>
    
      <ng-template #popover>
        <button (click)="pop.hide()">Test</button>
      </ng-template>
    </div>
    

    TS

    private _currentPopover: any;
    
    @Input() varArr;
    
    ngOnInit() {
    
    }
    
    public closeOldPopover(popover: any): void {
      if (this._currentPopover && this._currentPopover !== popover) {
        this._currentPopover.hide();
      }
    
      this._currentPopover = popover;
    }
    

    【讨论】:

    • 对不起,这并不能解决要求。我为更少的信息道歉。在弹出窗口中有一些需要点击的按钮。如果我使用 triggers="mouseenter:mouseleave" 我无法单击弹出框内的按钮
    • 好的,这是一个新要求。然后将 mouseleave 替换为 click 并使用 autoClose ('inside', 'outside', true, false) 播放一下。我认为这应该可以解决您的问题。
    • 它的 ngx-bootstrap 不是 ng-bootstrap
    • @Patata 我对 ngx-bootstrap 的错,但现在它是正确的。更新后的解决方案应该适合您。
    • 感谢更新,但正如我在问题 As per requirement I want above sample should controlled by parent component and target popover lies in child component. I need this for modularity requirement 中提到的那样。隐藏逻辑在子组件中完成,我需要在父组件中完成
    猜你喜欢
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2023-03-06
    • 2018-04-06
    相关资源
    最近更新 更多