Я пытаюсь использовать самую базовую функцию коллапса внутри модала, но коллапс не сработает
Буквально просто скопировал этот пример свертывания w3schools в свой модальный.
Это мой модальный код:
<template #content let-c="close" let-d="dismiss" ngbModalContainer>
<div class="modal-header">
<h4 class="modal-title">Collapse</h4>
</div>
<form>
<div class="modal-body">
<button type="button" class="btn btn-info" data-toggle="collapse" data-target="#demo">Simple collapsible</button>
<div id="demo" class="collapse">
This is the collapsible text!
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" (click)="c('Close click')">Close</button>
</div>
</form>
</template>
<button class="btn btn-success" (click)="open(content)">Open Modal</button>
Мой BasicModalComponent:
@Component({
selector: 'basic-modal',
templateUrl: './BasicModal.html'
})
export class BasicModalComponent {
closeResult: string;
constructor(private modalService: NgbModal) {}
open(content) {
this.modalService.open(content).result.then((result) => {
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
}
private getDismissReason(reason: any): string {
if (reason === ModalDismissReasons.ESC) {
return 'by pressing ESC';
} else if (reason === ModalDismissReasons.BACKDROP_CLICK) {
return 'by clicking on a backdrop';
} else {
return `with: ${reason}`;
}
}
}
Мой AppComponent:
@Component({
selector: 'my-app',
template: '<basic-modal></basic-modal>'
})
export class AppComponent { }
Мой AppModule:
@NgModule({
imports: [NgbModule, FormsModule],
declarations: [AppComponent, BasicModalComponent],
bootstrap: [AppComponent],
})
export class AppModule {
}
Я пытался отладить поведение коллапса в DOM, похоже, что когда вы сворачиваете <div>
, он добавляет ему несколько классов и несколько атрибутов, а при свертывании обратно он также меняет их.
Когда я отлаживал его в модальном режиме, нажатие кнопки «Свернуть» не манипулирует DOM, класс <div>
и его атрибуты остались прежними.
Любые идеи?
2 ответа
В вашем случае вы можете "monkey patch" ModalWindow
, как описано ниже:
open(content) {
// get reference to NgbModalRef
let modal: any = this.modalService.open(content);
modal.result.then((result) => {
this.closeResult = `Closed with: ${result}`;
}, (reason) => {
this.closeResult = `Dismissed ${this.getDismissReason(reason)}`;
});
let cancelPropagation = false;
// overriding methods of NgbModalWindow
Object.assign(modal._windowCmptRef.instance.constructor.prototype, {
stopPropagation: () => {
cancelPropagation = true;
},
backdropClick: function() {
if(cancelPropagation) {
cancelPropagation = false;
return;
}
if (this.backdrop === true) {
this.dismiss(ModalDismissReasons.BACKDROP_CLICK);
}
}
});
}
Но это очень грязный способ, потому что он использует частную собственность.
Вы бы использовали директиву NgbCollapse, которая является частью пакета ng-bootstrap
, например:
<button type="button" class="btn btn-info" (click)="isCollapsed = !isCollapsed">
Simple collapsible
</button>
<div [ngbCollapse]="isCollapsed">
This is the collapsible text!
</div>
ng-bootstrap крайне препятствует смешиванию виджетов Angular 2 с javascript на основе jQuery Bootstrap. На самом деле весь смысл использования такой библиотеки, как ng-bootstrap, заключается в том, чтобы не Используйте Bootstrap's JS.
Вместо этого вам следует использовать директиву сжатия: ngbCollapse
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Имейте в виду, что JavaScript — это НЕ то же самое, что Java! Включите все ярлыки, относящиеся к вашему вопросу; например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [svelte] и т. д.