1

I am trying to implement bootstrap4 popover using jquery in angular7. I have included "popper.js" in index.html and included using npm too. but it's not working.

Uncaught TypeError: jquery__WEBPACK_IMPORTED_MODULE_2__(...).popover is not a function

this error only appears in the console.

HTML:(sample.component.html)

<button id="option2" autocomplete="off" data-toggle="popover"> Public</button>

Jquery: (sample.component.ts)

import { Component, OnInit } from '@angular/core';
import * as $ from 'jquery';

@Component({
  selector: 'app-sample',
  templateUrl: './sample.component.html',
  styleUrls: ['./sample.component.css']
})
export class SampleComponent implements OnInit {

  constructor() { }   
  ngOnInit() {   
    $(document).ready(function(){   
      $('[data-toggle="popover"]').popover();     
      $('#option2').popover({
         html: true,
        content: function() {
          return $("#div").html();
        },
         placement: 'bottom'
      });            
    });
  }

How to achieve bootstrap popover in angular 7?

1 Answer 1

5

Attention: using jQuery in Angular is not a good practice as @ErikHer implied. The interesting thing in this case is to use the ng-bootstrap library, which is a library developed in the angular standards with the elements Bootstrap 4 or less. Also you can use Bootstrap 5, where they stopped using jQuery.

Anyway, the method below works, but it is not recommended.

Thank you @ErikHer for making the answer more complete.


Change your component file to that way:

import { Component, OnInit } from '@angular/core';
declare var $: any; // ADD THIS
import * as $ from 'jquery';

@Component({
  selector: 'app-sample',
  templateUrl: './sample.component.html',
  styleUrls: ['./sample.component.css']
})
export class SampleComponent implements OnInit {

  constructor() { }   
  ngOnInit() {   
    $('[data-toggle="popover"]').popover();
  }

You don't need use $(document).ready() because the NgOnInit() do the same thing. And the $('[data-toggle="popover"]').popover(); will start all Popover you have in your component.

You can use title, data-placement and data-content attributes for make the Popover like:

<button id="option2" autocomplete="off" data-toggle="popover" data-placement="bottom" title="popover's title" data-content="popover's text"> Public</button>

Or you can initialize the popover with the function that you used in NgOnInit():

$('#option2').popover({
         html: true,
        content: function() {
          return $("#div").html();
        },
         placement: 'bottom'
      }); 

Hope this helps.

Sign up to request clarification or add additional context in comments.

1 Comment

please, don't use jQuery in Angular :( :(

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.