AngularJS bootstrap popover with another directive Object [object Object] has no method 'popover'

14,295

Solution 1

I would recommend looking into AngularStrap Popovers. Generally, I'd recommend AngularUI, but AngularStrap supports template partials in popovers and AngularUI doesn't.

If you do go with AngularStrap, you can just write an HTML partial to be displayed in the popover and that partial can include whatever directives you like just like a normal Angular partial.

Solution 2

Loading jQuery prior to angular will solve the issue. Technically the problem is loading jQuery twice (one from angular i.e. jqLite and the other is loaded later as separate js file)

explained here https://stackoverflow.com/a/8792470

Share:
14,295
americanslon
Author by

americanslon

Updated on June 14, 2022

Comments

  • americanslon
    americanslon about 2 years

    I have a button that I would like to trigger a bootstrap popover. That works fine except that I need that popover to have another directive in it (basically popover contains a list of items).

    I have found this article http://tech.pro/tutorial/1360/bootstrap-popover-using-angularjs-compile-service but following it doesn't seem to work for me very well.

    I made a custom directive

    .directive('popoverhtml', function ($compile) {
        return {
            restrict: 'A',
            transclude: true,
            template: "<span ng-transclude></span>",
            scope: {
    
            },
            link: function (scope, element, attrs) {
                console.log($(element));
                var options = {
                    content: "<br><br>Hey",
                    placement: "right",
                    html: true,
                    title: "HEY",
                    trigger: "click"
                };
                $(element).popover(options);
            }
        }
    

    and the following is my HTML mark up

    <button type="button" class="btn btn-primary btn-small" popoverHTML><i class="icon-white icon-plus"></i></button>
    

    For now I am not passing any custom html to it (if anybody knows how to do that I'd appreciate some guidance on this as well) I am just trying to get the popover appear with the html hardcoded in content param of the options object.

    However I am getting the following error as soon as the view with the button loads (before I click on the button)

    TypeError: Object [object Object] has no method 'popover'

    According to my googlefu this can mean quite a lot of things and I would appreciate some insight on what that could mean in the context of Angular.

    Thank you!

    EDIT: List of my JS includes.

    <script src="//ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular-resource.min.js"></script>
    <script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.4.0.js"></script>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/2.0.3/jquery.min.js"></script>    
    <script src="//cdnjs.cloudflare.com/ajax/libs/toastr.js/1.3.1/js/toastr.min.js"></script>   
    <script src="//cdnjs.cloudflare.com/ajax/libs/angular-strap/0.7.4/angular-strap.min.js"></script>      
    <script src="js/admin-angular.js"></script>  <-- My custom include
    <script src="js/admin-jquery.js"></script>   <-- My custom include
    <script src="js/jquery.watermark.min.js"></script>    
    <script src="js/jquery.base64.js"></script>
    
  • americanslon
    americanslon almost 11 years
    Thanks! I saw this but didn't want to do deal with yet another JS include if I didn't have to. It looks like the AngularStrap has a lot of the same controls (tabs, buttons, etc>) that I use Angular UI-Bootstrap for, so I can potentially drop the latter. Any opinion on this? Differences, etc? Thanks.
  • americanslon
    americanslon almost 11 years
    So this is interesting....I get the same thing if I use AngularStrap. Same exact error. I have appended the original question with the list of my JS includes...I feel like there is some conflict going on there or something along those lines.
  • Jon7
    Jon7 almost 11 years
    @americanslon Have you changed your code to use AngularStrap instead of using bootstrap directly?
  • dmackerman
    dmackerman almost 11 years
    AngularStrap is a wrapper around the base Bootstrap.js components. BootstrapUI is a total rewrite, and is a more robust framework. I'm struggling with the same issue at the moment - trying to include some HTML in my popover. It's being discussed in this github issue: github.com/angular-ui/bootstrap/issues/220