Я пытаюсь использовать самую базовую функцию коллапса внутри модала, но коллапс не сработает

Буквально просто скопировал этот пример свертывания 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> и его атрибуты остались прежними.

Любые идеи?

1
Kesem David 5 Сен 2016 в 15:49

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>

Пример плунжера

1
yurzui 5 Сен 2016 в 20:10

ng-bootstrap крайне препятствует смешиванию виджетов Angular 2 с javascript на основе jQuery Bootstrap. На самом деле весь смысл использования такой библиотеки, как ng-bootstrap, заключается в том, чтобы не Используйте Bootstrap's JS.

Вместо этого вам следует использовать директиву сжатия: ngbCollapse

3
pkozlowski.opensource 7 Сен 2016 в 15:00