Как открыть содержимое компонента в модальном режиме начальной загрузки?

У меня есть компонент, который я хочу внедрить в модальное окно с помощью функций ng bootstrap, поэтому я импортировал модули в приложение, а также добавил их в точки входа, как это предлагается в документах ng-bootstrap, что доставляет мне мало проблем. каков правильный подход, в основном я вызываю модальный из существующего компонента, и этот компонент должен загружаться в модальное окно. любая помощь будет оценена.

modal.component.ts

import {Component, Input} from '@angular/core';

import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'ngbd-modal-content',
  template: `
    <div class="modal-header">
      <h4 class="modal-title">Hi there!</h4>
      <button type="button" class="close" aria-label="Close" (click)="activeModal.dismiss('Cross click')">
        <span aria-hidden="true">&times;</span>
      </button>
    </div>
    <div class="modal-body">
      <p>Hello, {{name}}!</p>
    </div>
    <div class="modal-footer">
      <button type="button" class="btn btn-outline-dark" (click)="activeModal.close('Close click')">Close</button>
    </div>
  `
})
export class NgbdModalContent {
  @Input() name;

  constructor(public activeModal: NgbActiveModal) {}
}

деталь.компонент.ц

import { Component, OnInit,Pipe, PipeTransform, EventEmitter,Input, Output,OnChanges, SimpleChanges } from '@angular/core';
import {NgbModal,NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';

  @Component({
      selector: 'app-detail',
      templateUrl: './detail.component.html',
      styleUrls: ['./detail.component.css'],

    })
export class DetailComponent implements OnChanges{

constructor(private detailService: DetailService,private ngbModal: NgbModal) {};

onClick(evt){
     const modalRef = this.ngbModal.open(Component);

   }
}

detail.component.html

<div class="card card-outline-info">
  <div class="card-header bg-info"><h5>Detail</h5><button (click)="onClick($event)"></button></div>
  <div class="card-block">
      <div class="table-responsive" style="cursor: pointer">
        <generic-table [gtClasses]="'table-hover'" #myCustomTable [gtSettings]="secondConfigObject.settings" [gtFields]="secondConfigObject.fields" [gtData]="secondConfigObject.data"></generic-table>
      </div>
    </div>
  </div>

app.module.ts

import { NgbModule,NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
import { NgbdModalContent } from './NgModal/modal.component';


@NgModule({
  declarations: [
    AppComponent,
    StreamComponent,
    SearchComponent,
    DetailComponent,
    SlaChartComponent,
     NgbdModalContent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    HttpClientModule,
    HttpModule,
    ChartsModule,
    BrowserAnimationsModule,
     NgbModule.forRoot()

  ],
  providers: [StreamService,DatePipe,
              SearchService,
              DetailService,
              ChartService,AuthService,NgbActiveModal,
            {provide: HTTP_INTERCEPTORS,
            useClass: TokenInterceptor,
            multi: true}],
  entryComponents: [NgbdModalContent,DetailComponent],
  bootstrap: [AppComponent]
})

person hussain    schedule 14.02.2018    source источник


Ответы (1)


Попробуйте это, я не поклонник вашего файла modal.component.ts, поэтому выбросьте его и удалите NgbdModalContent из вашего app.module.ts.

yourModal.component.html

<ng-template #theModal let-c="close" let-d="dismiss">
    <div class="modal-header">
        <h4 *ngIf="type == 0" class="modal-title">Header</h4>
        <button type="button" class="close" aria-label="Close" (click)="d('Cross click')">
            <span aria-hidden="true">&times;</span>
        </button>
    </div>
    <div class="modal-body">
  <p>Hello, {{name}}!</p>
    </div>
    <div class="modal-footer">
        <button type="button" id="cancel-edit-btn" class="btn btn-primary" (click)="c('Close click')">Cancel</button>
    </div>
</ng-template>

yourModal.component.ts

import { Component, OnInit, Input, Output, EventEmitter, ViewChild, ViewChildren, ElementRef, Renderer2 } from '@angular/core';
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';

@Component({
  selector: 'app-custom-modal',
  templateUrl: './yourModal.component.html',
  styleUrls: ['./yourModal.component.scss']
})
export class EditNotesComponent implements OnInit {
  @Input() name: string;
  @ViewChild('theModal') theModal: ElementRef;

  constructor(private modalService: NgbModal) {}

  ngOnInit() {
  }

  showModal() {
    this.modalService.open(this.theModal, { size: 'sm', backdrop: 'static'});
  }

}

detail.component.html

<div class="card card-outline-info">
  <div class="card-header bg-info"><h5>Detail</h5><button (click)="yourCustomModal.showModal()"></button></div>
  <div class="card-block">
      <div class="table-responsive" style="cursor: pointer">
        <generic-table [gtClasses]="'table-hover'" #myCustomTable [gtSettings]="secondConfigObject.settings" [gtFields]="secondConfigObject.fields" [gtData]="secondConfigObject.data"></generic-table>
      </div>
    </div>
  </div>
<app-custom-modal #yourCustomModal [name]="name"></app-custom-modal>

деталь.компонент.ц

import { Component, OnInit,Pipe, PipeTransform, EventEmitter,Input, Output,OnChanges, SimpleChanges } from '@angular/core';

  @Component({
      selector: 'app-detail',
      templateUrl: './detail.component.html',
      styleUrls: ['./detail.component.css'],

    })
export class DetailComponent implements OnChanges{
name: string;

constructor(private detailService: DetailService) {
this.name = 'John Doe';};

}
person Kevin    schedule 14.02.2018
comment
спасибо за подробный ответ, как бы мы передали детальный компонент в модальный, в основном подробный вид, который я хотел загрузить в модальный - person hussain; 15.02.2018
comment
все, что вы хотите поместить в свое модальное окно, вы помещаете в модальное тело yourModal.component.html. Вам нужен отдельный компонент, который содержит ваш модальный. В примере, который я показал, detail.component.html содержит кнопку, и при нажатии на нее отобразится модальное окно. Если вам нужны определенные вещи в вашем модальном окне, вам нужно поместить этот html в файл yourModal.component.html. - person Kevin; 15.02.2018
comment
что вы имеете в виду при нажатии yourCustomModal, это имя модального компонента? - person hussain; 15.02.2018
comment
Это происходит от # в ‹app-custom-modal #yourCustomModal .....›‹/app-custom-modal› в файле detail.component.html. Это позволяет вам использовать этот модальный компонент и вызывать его функцию openModal, когда вы нажимаете кнопку - person Kevin; 15.02.2018
comment
я пробовал разные сценарии, он всегда выдает ошибку, имя которой неизвестно, для модального компонента. Не могли бы вы предоставить Jfiddle? - person hussain; 15.02.2018
comment
Имя @Input(): строка; в вашем модальном компоненте? - person Kevin; 16.02.2018
comment
да, но я его не использую, я просто хочу, чтобы м-компонент передал мой детальный компонент в модальный - person hussain; 16.02.2018
comment
почему вы не можете просто поместить html вашего подробного компонента в html модального компонента? Почему вы пытаетесь передать компонент в другой как переменную? - person Kevin; 16.02.2018
comment
потому что мне нужна динамическая функция, я буду вызывать это модальное окно из другого компонента и передавать в него компоненты - person hussain; 16.02.2018
comment
Вместо того, чтобы передавать компонент в модальное окно, вы должны просто сделать этот компонент модальным. Это то, что делает решение, которое я опубликовал. - person Kevin; 16.02.2018