Reputation: 1895
I have an ng-click in in a bootstrap popover that doesnt seem to work. when I move it out of the popup into the page it seems to work. Also the ng-model value doesnt seem to update either.
<div id="popover-content" class="hide">
<input type="text" placeholder="Quote ID" ng-model="selectedItems.quote.label">
<button type="button" ng-click="newQuote()">New quote</button>
</div>
Is this because the popover is created in the dom and angular does not know it exists? Any ideas how I can get it to work? Thanks
EDIT:
Here is the newQuote
$scope.newQuote = function() {
$scope.selectedItems.quote = angular.copy(defaultQuote);
$scope.solution.quotes.push($scope.selectedItems.quote);
$scope.selectedItems.quote.label = 'New Quote';
$scope.addMessage('Quote created successfully', 2);
};
EDIT 2
Here is a plunker showing the issue - the alert is not displayed when ng-click="newQuote()" is fired http://plnkr.co/edit/ANH98vlflPK9c5qA3ohO?p=preview
Upvotes: 3
Views: 7513
Reputation: 1738
You should create a Directive
to make angular works with Bootstrap Popover
. You can take a look in your Developer console when using Bootstrap Popover. It actually does not reuse the DOM
that you predefined - ie :
<input type="text" placeholder="Quote ID" ng-model="selectedItems.quote.label">
<button type="button" ng-click="newQuote()">New quote</button>
But add in a new piece of DOM
- ie
<div class="popover fade bottom in" role="tooltip" id="popover770410" style="top: 30px; left: 0px; display: block;">
<div class="arrow" style="left: 15.9420289855072%;">
</div><h3 class="popover-title">New quote</h3><div class="popover-content">
<input type="text" placeholder="Quote ID" ng-model="selectedItems.quote.label" class="ng-pristine ng-untouched ng-valid">
<button type="button" ng-click="newQuote()">New quote</button>
</div>
</div>
Therefore Angular
will not understand new piece of DOM
because it has not compiled yet - ie : You cannot use ng-click
as well as ng-modal
. One way to work around this is to create a directive
and compile
your html
content before passing that piece of DOM
to Bootstrap Popover
.
I have created this fiddle to demonstrate this idea.
As you can see :
I have compile you content
and bind it to current scope
$compile(content)(scope);
Before passing that piece of DOM
to popover
var options = {
content: compileContent,
html: true,
title: title
};
$(elem).popover(options);
With this way to can let Angular understand new piece of DOM
added and do its work correspondingly.
Furthermore, actually there quite some directives
that works with Bootstrap Popover
that you can take a look at instead of creating new directives
Reference :
Upvotes: 10