I am trying to render a modal like so:
HTML
<div class="btn-holder">
<a (click)="this.open()" class="btn btn-success text-uppercase">Edit My Profile</a>
</div>
Module:
imports: [BrowserModule, HttpModule,
RouterModule.forRoot(appRoutes),
NgbModule.forRoot(),
EditProfileComponent
],
Component:
import {Component} from "@angular/core";
@Component({
selector: 'edit-profile',
templateUrl: './editProfile.html'
})
export class EditProfileComponent{
constructor(){
}
submitForm(){
}
}
The issue is I am not sure how to get it working because the doc are vague. Advice?
I have tried the following:
@Component({
selector: 'edit-profile',
templateUrl: './editProfile.html'
})
export class EditProfileComponent{
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}`;
}
}
}
HTML:
<a (click)="open(content)" class="btn btn-success text-uppercase">Edit My Profile</a>
</div>
Error in console when I click the button:
ERROR TypeError: _co.open is not a function
at Object.eval [as handleEvent] (ProfileComponent.html:46)
at handleEvent (core.es5.js:12047)
at callWithDebugContext (core.es5.js:13508)
at Object.debugHandleEvent [as handleEvent] (core.es5.js:13096)
at dispatchEvent (core.es5.js:8659)
at core.es5.js:9270
at HTMLAnchorElement.<anonymous> (platform-browser.es5.js:2668)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:424)
at Object.onInvokeTask (core.es5.js:3924)
at ZoneDelegate.webpackJsonp.../../../../zone.js/dist/zone.js.ZoneDelegate.invokeTask (zone.js:423)
I have look at the plunker examples but when I implement them it seems to break my app. I added the component and dependency to app.module.
Advice?
If you are adding the bootstrap path into the angular. json file, make sure it is the styles within the project\architect\build. Not the one in the project\architect\test.
We can check Bootstrap-specific method is available or not. Syntax: var bootstrap = (typeof $(). "Bootstrap-specific method" == 'function');
ng-bootstrap depends on Bootstrap's CSS being available, but you don't need the Bootstrap JS or jQuery dependencies. This will take care of adding the CSS dependencies for Bootstrap and Font Awesome.
Bootstrap 5 is designed to be used without jQuery, but it's still possible to use our components with jQuery. If Bootstrap detects jQuery in the window object it'll add all of our components in jQuery's plugin system; this means you'll be able to do $('[data-bs-toggle="tooltip"]'). tooltip() to enable tooltips.
If you are trying to Display a Modal you can directly use Bootstrap in your Angular . Like So
npm install bootstrap --save
In Angular-cli.json
"styles": [
"styles.css",
"../node_modules/bootstrap/dist/css/bootstrap.min.css"
],
"scripts": ["../node_modules/jquery/dist/jquery.js",
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
],
IN COMPONENT
import { Component } from '@angular/core';
declare var $ :any;
@Component({
For more info on how to import third party lib LINK
Working Modal - LINK.
and if you want to check the source code for the working modal LINK.
Working Plunker Link: http://plnkr.co/edit/vTY9gG9QcL25Wm9NTBqS?p=preview
1) In your app.module.ts, Looks like you are not declaring EditProfileComponent. Instead of imports, put EditProfileComponent in declarations. Refer to the code below:
@NgModule({
imports: [BrowserModule,HttpModule,
RouterModule.forRoot(appRoutes), NgbModule.forRoot()],
declarations: [App, EditProfileComponent]
bootstrap: [App]
})
2) Your component looks good:
import {Component} from '@angular/core';
import {NgbModal, ModalDismissReasons} from '@ng-bootstrap/ng-bootstrap';
@Component({
selector: 'edit-profile',
templateUrl: './editProfile.html'
})
export class EditProfileComponent {
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}`;
}
}
}
3) In your HTML edit-profile.html, you seem to be missing the ng-template that would be referred to display Modal.
If you notice, we pass 'content' in the function when we click on 'a' tag. This 'content' is the local reference to the template in the html. We use the instance 'this.modalService' of 'NgbModal' to open the specific modal in our component.
<ng-template #content let-c="close" let-d="dismiss">
<div class="modal-header">
<h4 class="modal-title">Modal title</h4>
<button type="button" class="close" aria-label="Close" (click)="d('Cross click')">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>One fine body…</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" (click)="c('Close click')">Close</button>
</div>
</ng-template>
<a (click)="open(content)" class="btn btn-success text-uppercase">Edit My Profile</a>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With