Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Html file as content in Bootstrap popover in AngularJS directive

I have an Angular directive to handle Bootstrap popovers as shown in the code below. In my directive I'm setting the popover content to a HTML string, which I think is ugly. What I wanna do is to use an "template.html" file instead of HTMLstring. In that way I will be able to use the same directive with different template files depending on which type of popover I wanna show. That's my plan anyway.

So, how do I in the best way load html code from my template.html and use it instead of the HTMLstring in the AngularJs directive below?

app.directive('mypopover', function ($compile) {  var HTMLstring = "<div><label class='control-label' style='color: rgb(153, 153,153)'>Search</label>&nbsp;&nbsp;"+"<input placeholder='Search assignment' ng-model='searchText' type='text' class='form-control'> <br>"+"<label class='control-label' style='color: rgb(153, 153, 153)'>Select an assignable</label>"+"<p ng-repeat='p in projects | filter:searchText'ng-click='createEvent(user.id,date)'>"+"{{p.title}}</p></div>";  var getTemplate = function (contentType) {     var template = '';     switch (contentType) {         case 'user':             template = HTMLstring;             break;     }     return template; } return {     restrict: "A",     link: function (scope, element, attrs) {         var popOverContent;         if (scope.user) {             var html = getTemplate("user");             popOverContent = $compile(html)(scope);                             }         var options = {             content: popOverContent,             placement: "right",             html: true,             date: scope.date         };         $(element).popover(options);     },     scope: {         user: '=',         date: '='     } }; }); 
like image 790
rilar Avatar asked Jan 26 '14 11:01

rilar


People also ask

How do you make a popover in HTML?

How To Create a Popover. To create a popover, add the data-toggle="popover" attribute to an element. Note: Popovers must be initialized with jQuery: select the specified element and call the popover() method.

Which of the directive is used to display text in AngularJS?

AngularJS Directives The ng-app directive initializes an AngularJS application. The ng-init directive initializes application data. The ng-model directive binds the value of HTML controls (input, select, textarea) to application data.

How does bootstrap define popover?

A Bootstrap Popover is an attribute in bootstrap that can be used to make any website look more dynamic. Popovers are generally used to display additional information about any element and are displayed with a click of a mouse pointer over that element.


1 Answers

A quick solution is using templateCache with inline template:

Inline template:

<script type="text/ng-template" id="templateId.html">       This is the content of the template </script> 

Js:

app.directive('mypopover', function ($compile,$templateCache) {      var getTemplate = function (contentType) {         var template = '';         switch (contentType) {             case 'user':                 template = $templateCache.get("templateId.html");                 break;         }         return template;     } 

DEMO

If you need to load external templates, you need to use ajax $http to load the templates manually and put in the cache. Then you can use $templateCache.get to retrieve later.

$templateCache.put('templateId.html', YouContentLoadedUsingHttp); 

Sample code:

var getTemplate = function(contentType) {     var def = $q.defer();      var template = '';     switch (contentType) {       case 'user':         template = $templateCache.get("templateId.html");         if (typeof template === "undefined") {           $http.get("templateId.html")             .success(function(data) {               $templateCache.put("templateId.html", data);               def.resolve(data);             });         } else {            def.resolve(template);         }         break;     }     return def.promise;   } 

DEMO

like image 128
Khanh TO Avatar answered Sep 19 '22 07:09

Khanh TO