всплывающее окно начальной загрузки ngx не работает должным образом

#angular #ngx-bootstrap

#angular #ngx-bootstrap

Вопрос:

Я использую всплывающее окно начальной загрузки ngx. Я хочу, чтобы всплывающее окно открывалось при наведении курсора мыши, и все открытые должны быть закрыты, если открыто новое.

рабочий пример

В соответствии с требованием, которое я хочу, чтобы приведенный выше образец должен контролироваться родительским компонентом, а целевое всплывающее окно находится в дочернем компоненте. Мне это нужно для требования модульности

ngFor в демонстрации html дочернего компонента это неправильная демонстрация

Обновлена демонстрационная версия 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», я не могу нажимать кнопки внутри всплывающего окна

Ответ №1:

Я меняю ваш код и надеюсь, что это то, что вам нужно

здесь

Обновить:

вот окончательный код

Комментарии:

1. Спасибо, что ваш код работает в демонстрационной / примерной программе, но в моем реальном случае он не работает. Разница в том, что дочерний компонент получает данные из API, и возникает какая-то задержка. это может быть причиной.

2. ngAfterViewInit() { this.popovers.forEach((popover: PopoverDirective) => { popover.onShown.subscribe(() => { this.popovers .filter(p => p !== popover) .forEach(p => p.hide()); console.log(popover) //demo shows in demo, but in my actual code it doesn't }); }); }

3. переместите this.popovers.foreach… сразу после этого.popovers=(items); возможно, это исправит это

4. спасибо за справку, консоль показывает журналы, но не работает, версия angular — 6.1.10, а версия ngx-bootstrap — 3.3.0. Вызывает ли это изменение проблему

5. нет, проблема не связана. попробуйте добавить 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 amp;amp; this._currentPopover !== popover) {
    this._currentPopover.hide();
  }

  this._currentPopover = popover;
}
  

Комментарии:

1. Извините, это не решает проблему. Я приношу извинения за меньший объем информации. Во всплывающем окне есть несколько кнопок, на которые нужно нажать. Если я использую triggers="mouseenter:mouseleave" , я не могу нажимать кнопки внутри всплывающего окна

2. Хорошо, это новое требование. Затем замените mouseleave на click и немного поиграйте с AutoClose (‘inside’, ‘outside’, true, false). Я думаю, это должно решить вашу проблему.

3. его ngx-bootstrap, а не ng-bootstrap

4. @Patata Моя ошибка с ngx-bootstrap, но теперь это правильно. Обновленное решение должно работать для вас.

5. спасибо за обновление, но, как я уже упоминал в вопросе 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 . Скрытие логики выполняется в дочернем компоненте, и мне нужно выполнить в родительском компоненте