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