I have an Angular App Component generated via the CLI (Angular 4).
I've brought in jQuery + Bootstrap like so:
"styles": [
"../node_modules/bootstrap/dist/css/bootstrap.min.css",
"styles.css"
],
"scripts": ["../node_modules/jquery/dist/jquery.min.js",
"../node_modules/bootstrap/dist/js/bootstrap.min.js"
],
My App Component looks like so:
import { Component, AfterViewInit } from '@angular/core';
import * as $ from 'jquery';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: [
'./app.component.css']
})
export class AppComponent implements AfterViewInit {
title = 'app';
constructor() { }
ngAfterViewInit() {
$('.nav a').click(function () {
$('.navbar-collapse').collapse('hide');
});
}
}
Receiving the following error:
ERROR TypeError: __WEBPACK_IMPORTED_MODULE_1_jquery__(...).collapse is not a function
Is Bootstrap not being imported properly? I've tried adding the following to the top of my component:
import 'bootstrap/dist/js/bootstrap.js';
EDIT:
One thing I've noticed. When running in the browser if I execute the following line through the Chrome Console it works without issue:
$('.navbar-collapse').collapse('hide');
What would be the difference here? I must be missing something.
The below step resolved this issue for me..
I replaced the jquery import command in the component from
import * as $ from 'jquery';
to
declare var $ : any;
As mentioned in the comment , it seems to be an issue of Bootstrap requiring jquery to be global. A very similar question is answered in the following link :-
2 fullcalender instances in Angular component causes jquery not found error
The other option is define types for collapse as mentioned in -cloud's answer
You should not specify your dependencies like that.
Since you've installed bootstrap and jQuery via npm/yarn, you ought to import them directly like import * as $ from 'jquery';
without configure something else. No scripts
is needed.
scripts
config is supposed to be treated as global script as script tag inside index.html
, see the scripts story here.
Since collapse
is a jquery plugin from bootstrap
, you should do something like
interface JQuery {
collapse(options?: any): any;
}
to let typescript know its types.
you can install @types/bootstrap
to skip defining the interfaces.
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