Модальное окно ng-bootstrap не отображается

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

это мой app.module.ts

import {NgModule }      from '@angular/core';
import {BrowserModule } from '@angular/platform-browser';
import {TaskService} from '../app/task/task.service';
import {TaskComponent} from '../app/task/task.component';
import {AppComponent }  from './app.component';
import {FormsModule ,ReactiveFormsModule} from '@angular/forms';
import {HttpModule } from '@angular/http';
import {RouterModule, Routes,Route } from '@angular/router';
import {AddNewTaskComponent} from './task/addtask.component';
import {EventComponent} from '../app/controller/event.component'
import {EventService} from '../app/service/event.service'
import {AddNewEventComponent} from '../app/controller/addevent.component'
import {AddEventService} from '../app/service/addevent.service'
import {WeatherComponent} from '../app/controller/weather.component'
import {LoginComponent} from '../app/controller/login.component'
import {RegisterComponent} from '../app/controller/register.component'
import {DashBoardcomponent} from '../app/controller/dashboard.component'
import {FeatureComponent,StoryComponents} from '../app/controller/feature.component'
import {AddTaskService} from '../app/task/addtask.service'
import {FeatureServices } from '../app/service/feature.services'
import {FileUploadComponents } from '../app/controller/fileUpload.component'
import {AngularFireModule } from 'angularfire2'
import {NgbModule } from '@ng-bootstrap/ng-bootstrap'


//index routing , redirect to login for the blank request
const indexRoutes:Route = {
  path:'',component:LoginComponent
}

// for all invalid routers , it will redirect to login component
const fallbackRoutes = {
  path:'**',component:LoginComponent
}


// order is important, routes get called on the order which they defined
const routes: Routes = [
  indexRoutes,

  { path: 'register', component: RegisterComponent },
  { path: 'dash', component: DashBoardcomponent,
    children: [
      {   // shows feature   as default
          path: '',
          redirectTo: 'feature',
          pathMatch: 'full'
      },
      {   
          path: 'events', 
          component: EventComponent,
            children:[
              {  
                  path: 'addevent',
                  component: AddNewEventComponent
              }
            ]
      },
      
      {  
          path: 'task',
          component: TaskComponent,
          children:[
              {  
                  path: 'addtask',
                  component: AddNewTaskComponent
              }
            ]
      },
      { 
         path: 'weather',
         component: WeatherComponent
      },
      { 
         path: 'feature',
         component: FeatureComponent,
      },
      { 
         path: 'uploads',
         component: FileUploadComponents,
      }

  ]
 }
];

export const routing = RouterModule.forRoot(routes);
 
      };
@NgModule({
  imports:   [ 
    BrowserModule ,  
    FormsModule,
    ReactiveFormsModule,
    HttpModule,
    routing,
    AngularFireModule.initializeApp(firebaseConfig),
    NgbModule.forRoot()
    ],
    providers: [TaskService,EventService,AddEventService,AddTaskService,FeatureServices],
    declarations: [
      AppComponent,
      LoginComponent,
      TaskComponent,      
      AddNewTaskComponent,
      EventComponent,
      AddNewEventComponent,
      WeatherComponent,
      RegisterComponent,
      DashBoardcomponent,
      FeatureComponent,
      FileUploadComponents,
      StoryComponents
     ],
  entryComponents: [StoryComponents],
    bootstrap: [
     AppComponent 
    ],

    
})
export class AppModule { }

это мой класс FeatureComponent

import { Component, ViewChild,Input } from '@angular/core';
import { ModalComponent } from 'ng2-bs3-modal/ng2-bs3-modal';
import {FeatureServices} from '../service/feature.services'
import {ComponentAction} from '../base/Component.action'
import {Features} from '../model/feature'
import { NgForm } from '@angular/forms';
import {NgbModal, NgbActiveModal} from '@ng-bootstrap/ng-bootstrap';


@Component({
        selector: 'addstories',
        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-secondary" (click)="activeModal.close('Close click')">Close</button>
        </div>
    
    `    
})
export class StoryComponents {
  @Input() name;

  constructor(public activeModal: NgbActiveModal) {}
}

@Component({
    moduleId:module.id,
    selector:'feature',
    template:`
    
         <link rel="stylesheet" href="../../bower_components/bootstrap/dist/css/bootstrap.min.css">
         
        <div>
            <button class="btn btn-primary" (click)="listFeature()">All Features</button>
            <button class="btn btn-primary" (click)="showAddFeature()" >Add Features</button>
        </div>
        {{enableAddFeature}}
            <!-- loads child component list task and add new task -->
            <router-outlet></router-outlet>

            <form *ngIf="mode == 'insert' || mode == 'update' " #featureForm="ngForm" (ngSubmit)="processFeature(featureForm)">
                    <div class="form-group">
                        <label for="title">Feature Title</label>
                        <input type="text" class="form-control" id="title" name="title" placeholder="Enter Feature Title" [(ngModel)]=selectedFeature.title>
                    </div>
                    <div class="form-group">
                        <label for="descr">Feature Title</label>
                        <input type="text" class="form-control" id="descr" name="descr" placeholder="Enter Feature Description" [(ngModel)]=selectedFeature.descr>
                    </div>
                    <div class="form-group">
                        <label for="area">Feature Title</label>
                        <input type="text" class="form-control" id="area" name="area" placeholder="Enter Feature Area" [(ngModel)]=selectedFeature.area>
                    </div>                   
                    <button type="submit" class="btn btn-primary">Submit</button>
                    
                </form>
                <br/>
          <div class="container">
            <div class="row">
                <div class="">
                    <table class="table table-hover table-responsive table-bordered">
                        <thead>
                            <tr>
                                <th class="col-md-2">Title</th>
                                <th class="col-md-2">Descr</th>
                                <th class="col-md-1">Area</th>
                                <th class="col-md-1">User Stories</th>
                                <th class="col-md-1"></th>
                            </tr>
                        </thead>
                        <tbody>
                            <tr *ngFor="let feature of features">
                                <td><a data-toggle="modal" data-target="#myModal">{{feature.title}}</a></td>
                                <td>{{feature.descr}}</td>
                                <td>{{feature.area}}</td>
                                <td *ngIf ="feature.userstories == null" >0</td>
                                <td *ngIf ="feature.userstories != null" > {{feature.userstories.length}}</td>
                                <td><a class='btn btn-info btn-xs'  (click)="editFeature(feature._id)"><span class="glyphicon glyphicon-edit"></span> Edit</a> <a (click)="deleteFeature(feature)" class="btn btn-danger btn-xs"><span class="glyphicon glyphicon-remove"></span> Del</a></td>
                            </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>

    <button type="button" class="btn btn-default" (click)="open()">Open me!</button>

    `

})

export class FeatureComponent extends ComponentAction{

    features:Features[]
    mode :string = "start";
    isEditMode = false;
    selectedFeature: Features;
   

    constructor(private featureService:FeatureServices,private modalService: NgbModal){
       super();
       this.getFeatures();
    }

    getFeatures(){
        this.featureService.getFeatures()
        .subscribe(result => {
            console.log('features from mongo :'+JSON.stringify(result))
            this.features = result;
            console.log('this features :'+JSON.stringify(this.features))
        })  
    }


    open() {
        console.log('u clicked me');
        const modalRef = this.modalService.open(StoryComponents);
        modalRef.componentInstance.name = 'World';
        console.log('finshed');
  }
    

}

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


person Ansar Samad    schedule 23.04.2017    source источник


Ответы (5)


Я столкнулся с той же проблемой, проблема была с CSS. Когда я проверяю элементы документа, обнаруживаю, что модальные элементы были созданы, но не отображаются на экране. Ниже css решил проблему.

   .modal-backdrop.fade
   {
     opacity: 0.5;
   }
   .modal-open .modal
   {
     opacity: 1;
   }
person Vairavan    schedule 28.04.2017
comment
Хм. Это сработало. Зачем это нужно, а не исправлено в последней версии? - person BBaysinger; 25.09.2017
comment
Кроме того, мне пришлось добавить «!important» к непрозрачности .modal-backdrop.fade, чтобы заставить это работать. - person BBaysinger; 25.09.2017

ng-bootstrap работает только с Bootstrap 4 и не совместим с Bootstrap 3.

person Ansar Samad    schedule 23.04.2017
comment
Привет, спасибо за это, но я хочу реализовать это с помощью bootstarp 3, как это сделать? потому что весь мой проект зависит от версии bootstrap 3, если я использую 4 сейчас, это повлияет на все. кроме ng-bootstarap, можете ли вы предложить лучший подход для bootstarp 3.X - person Prasanna; 07.02.2018
comment
У меня есть бутстрап 4, но он не работает. Ответ @Vairavan решил мою проблему. - person Amir Ismail; 11.06.2018
comment
@PrasannaSasne проверить: npmjs.com/package/ng-bootstrap-to- бутстрап-3. Это сработало для меня. - person MotKohn; 30.08.2018

Как указал @Ansar Samad, он работает только с bootstrap 4. Если вам это нужно в проекте Bootstrap 3, вы можете проверить https://www.npmjs.com/package/ng-bootstrap-to-bootstrap-3

Инструкции:

  • npm install ng-bootstrap-to-bootstrap-3

  • import 'ng-bootstrap-to-bootstrap-3' где-то в вашем коде.

Вот и все!

person MotKohn    schedule 30.08.2018
comment
Вместо упомянутого вами импорта мне пришлось добавить «ng-bootstrap-to-bootstrap-3/dist/ng-bootstrap-to-bootstrap-3.min.css» после bootstrap css в файле angular.json - person myrmix; 12.11.2018
comment
@myrmix Понятно. Я сейчас использую webpack, портирую angular js на angular 6. - person MotKohn; 13.11.2018

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

@import url('../node_modules/bootstrap/dist/css/bootstrap.min.css');
person abhinav3414    schedule 29.05.2019
comment
Вы, сэр, джентльмен и ученый. Я бился головой о стену, а ты спас мне жизнь. - person caliche2000; 24.07.2021

Теперь обновление @ng-bootstrap/ng-bootstrap до ^8.0.1 устраняет эту ошибку,

После обновления, если вы получаете эту ошибку:

ОШИБКА в вызове getInternalNameOfClass() для класса, отличного от ES5

Попробуйте изменить цель в compilerOptions вашего tsconfig.json с es5 на es2015

person María Cristina Fernández López    schedule 11.03.2021