Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Render string templates via ng-include

Tags:

angularjs

I am trying to render a piece of html, available on a dynamic route, the route is fetched via a $http.get() call, it returns a piece of html,

Just to give an example I try to load this html partial:

<h1>{{ pagetitle }}</h1>
this is a simple page example

I made a small fiddle, to mock the problem, but for the simplicity i left the http call out, and just added the html in a string on the scope.

The controller is:

function Ctrl($scope) {
    $scope.data = {
        view: "<h1>whaaaaa</h1>"        
    }; 
}

The page html is this:

<div ng-app="">
  <div ng-controller="Ctrl">
    <div ng-include src="data.view"></div>
  </div>
</div>

The problem is that it does not add the string into the html file (ng-include), but it makes a http call to a url made of that string aparently.

So Is it not possible to just enter a string into an include? if not, what is the proper way to make an http call to a dynamic url, and enter the returned url into the page.

You can play with it in JSFiddle.

like image 587
Sander Avatar asked Aug 09 '13 14:08

Sander


People also ask

What is ng-template in angular?

What is ng-template in Angular? ng-template is an Angular element that is used for rendering HTML in a template. However, it is not rendered directly on DOM. If you include an ng-template tag to a template, the tag and the content inside it will be replaced by comment upon render.

What is the use of *ngif in <ng-template>?

This is a quite unseen format and is seldom used (using two sibling <ng-template> ). Here we are giving a template reference to the *ngIf in its then to tell it which template should be used if the condition is true. Using multiple <ng-template> like this is not advised (you could use <ng-container> instead) as this is not what they are meant for.

How to have multiple ng-template bindings on one element?

Can't have multiple template bindings on one element. You can use ng-container to move one directive to enclose the other as shown below. The following code shows the ng-template using the ngIf, then & else example. Here we use the ng-template specify the template for the then & else clause.

How to conditionally render the content in ng-content?

It renders the content as is. At the maximum you can split the content and render them at different locations of your view with the help of select attribute. You cannot conditionally render the content within ng-content. You have to show the content that is received from the parent with no means to make decisions based on the content.


2 Answers

You can add static hooks to the template cache, so let's say you have a service that gets the template:

myApp.service('myTemplateService', ['$http', '$templateCache', function ($templateCache) {
  $http(/* ... */).then(function (result) {
    $templateCache.put('my-dynamic-template', result);
  });

  /* ... */
}]);

Then, you can do:

<div include src=" 'my-dynamic-template' "></div>

NOTE reference name must be wrapped in single quotes, this always bytes me.... NOTE

Do note that you'll have to have assigned it to the template cache before angular tries to resolve the url.

EDIT:

If the dynamic URL logic is simple enough, you can also use a conditional in the ng-include, e.g.

<div ng-include="isTrue() && 'template1.html' || 'template2.html'"
like image 108
quinnirill Avatar answered Nov 15 '22 07:11

quinnirill


You can't do that with ng-include; reference:

ngInclude|src – {string} – angular expression evaluating to URL. If the source is a string constant, make sure you wrap it in quotes, e.g. src="'myPartialTemplate.html'".

Use directly ng-bind-html-unsafe like this:

<div ng-bind-html-unsafe="data.view"></div>

Demo

Creates a binding that will innerHTML the result of evaluating the expression into the current element. The innerHTML-ed content will not be sanitized! You should use this directive only if ngBindHtml directive is too restrictive and when you absolutely trust the source of the content you are binding to.

like image 22
EpokK Avatar answered Nov 15 '22 08:11

EpokK