2013-08-09 12 views
6

próbuję renderować kawałek HTML, dostępne na dynamicznym trasa, trasa jest pobierany przez $http.get() rozmowy, zwraca kawałek html,Render szablony ciąg poprzez ng obejmują

Wystarczy, otrzymując przykładem próbuję załadować html częściowy:

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

zrobiłem mały skrzypce, wyśmiewać problemu, ale dla uproszczenia opuściłem http zawołać, i po prostu dodaje html w ciąg w sprawie zakresu.

Kontroler jest:

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

stronie HTML jest taka:

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

Problemem jest to, że nie dodaje ciąg do pliku html (ng-to), ale wykonuje wywołanie http do adresu URL utworzonego z tego ciągu.

Więc nie można po prostu wprowadzić ciągu znaków do pliku włączania? jeśli nie, jaki jest właściwy sposób na wywołanie http do dynamicznego adresu URL i wprowadź zwrócony URL na stronę.

Możesz grać z nim w JSFiddle.

+1

Sprawdź swoją klawiaturę. '' Shift' key specific. Może to oznaczać pewne nieścisłości. Większość zdań zaczynasz od małej litery, a powinieneś używać kapitału. Ktoś musi edytować twoje pytanie i odpowiedzi i to naprawić. W końcu to dość nudne zadanie. Może kupisz sobie zupełnie nową klawiaturę z w pełni działającym klawiszem "Shift", jako swój własny świąteczny prezent? – trejder

Odpowiedz

11

Możesz dodać haki statycznych do pamięci podręcznej szablonów, więc powiedzmy, że masz usługę, która dostaje szablon:

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

    /* ... */ 
}]); 

Następnie można zrobić:

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

WSKAZÓWKA odniesienie nazwa musi być zawijana w pojedyncze cudzysłowy, to zawsze mnie bajta ... UWAGA

Do n Uwaga: zanim kątowy spróbuje rozwiązać adres URL, musisz go przypisać do pamięci podręcznej szablonów.

EDIT:

Jeśli logika dynamiczna URL jest dość prosta, można również korzystać z warunkowego w ng obejmują, na przykład

<div ng-include="isTrue() && 'template1.html' || 'template2.html'" 
+0

To jest to czego chciałem, wciągam moje częściowe szablony przez AMD, a następnie kontroler może je zmontować do szablonu $ templateCache i użyć ng-include = "'myTpl" – httpete

+1

Fantastyczna praca. Do leniwego obciążenia, po prostu włączam 'ng-if' na include i ustawię zmienną na true po wypełnieniu szablonu. –

6

Nie można tego zrobić z ng-include; numer:

ngInclude | src - {string} - wyrażenie kątowe oceniające adres URL. Jeśli źródłem jest stała łańcuchowa, upewnij się, że zawijasz ją w cudzysłów, np. src = "'myPartialTemplate.html'".

bezpośredniego użycia ng-bind-html-unsafe tak:

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

Demo

tworzy połączenia, które InnerHTML wynik oceny ekspresji do bieżącego elementu. Treść innerHTML-ed nie zostanie oczyszczona! Ta dyrektywa powinna być używana tylko wtedy, gdy dyrektywa ngBindHtml jest zbyt restrykcyjna i jeśli całkowicie ufasz źródłu zawartości, do której się zobowiązujesz.

+0

'ng-bind-html-unsafe' jest przestarzałe. Więcej informacji i alternatyw można znaleźć pod adresem http://stackoverflow.com/q/19415394/3123195. –

4

Można użyć ng-bind-html-unsafe

Jeśli nie ufasz html, który pochodzi z żądania AJAX, można również użyć ng-bind-html który potrzebuje usługi $sanitize do pracy (DEMO).

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

Do korzystania z tego należy dołączyć an extra js file.

angular.module('app', ['ngSanitize']); 

I oczywiście dodać aplikację do NG-app:

<div ng-app="app"> 
1

ng-include oczekuje URL do zewnętrznego fragmentu HTML, a nie ciąg HTML.

Chcesz ng-bind-html-unsafe:

Updated demo.

+3

ng-bind-html-unsafe działałby, ale jest użyteczny tylko przy drukowaniu html, a nie html, który ponownie musi być skompilowany za pomocą ng-binds, a co nie w środku. jednak rozwiązałem go, używając przykładu templatecache z @quinnirill, ponieważ jest to bardzo czyste rozwiązanie, bez potrzeby dodatkowego kompilowania html. wciąż dziękuję za pomysł – Sander