2013-08-09 8 views
6

Ich versuche, ein Stück HTML, auf einem dynamischen Weg verfügbar zu machen, die Route über einen $http.get() Anruf geholt wird, ist es ein Stück HTML zurückgibt,Render-String-Vorlagen über ng-umfassen

nur eine geben Beispiel versuche ich diesen hTML zu laden Teil:

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

ich machte eine kleine Geige, um das Problem zu verspotten, aber für die Einfachheit verließ ich die http ruft, und fügte hinzu, nur die html in einer Zeichenfolge auf dem Umfang.

Der Controller ist:

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

die HTML-Seite ist dies:

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

Das Problem ist, dass es nicht die Zeichenfolge in die HTML-Datei (ng-include), aber es funktioniert hinzufügen macht einen HTTP-Aufruf an eine URL, die aus dieser Zeichenfolge erzeugt wurde.

So ist es nicht möglich, nur eine Zeichenfolge in ein Include einzugeben? Wenn nicht, was ist der richtige Weg, um einen http-Aufruf an eine dynamische URL zu machen, und geben Sie die zurückgegebene URL in die Seite ein.

Sie können damit in JSFiddle spielen.

+1

Überprüfen Sie Ihre Tastatur. 'Shift' Taste spezifisch. Es kann zu Fehlfunktionen kommen. Sie beginnen die meisten Sätze mit einem kleinen Buchstaben, während Sie den ersten verwenden sollten. Jemand muss Ihre Frage und Antworten bearbeiten und beheben. Das ist eine ziemlich langweilige Aufgabe. Vielleicht können Sie sich ein brandneues Keyboard mit voll funktionierender Shift-Taste als Weihnachtsgeschenk kaufen? – trejder

Antwort

11

Sie können statische Haken an den Template-Cache hinzufügen, also lassen Sie uns sagen, dass Sie einen Dienst haben, der die Vorlage bekommt:

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

    /* ... */ 
}]); 

Dann können Sie tun:

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

HINWEIS Referenz Der Name muss in einfache Anführungszeichen gesetzt werden, dies wird immer von mir gesendet. HINWEIS

Do Beachten Sie, dass Sie es dem Vorlagencache zugewiesen haben müssen, bevor eckle versucht, die URL aufzulösen.

EDIT:

Wenn die dynamische URL-Logik einfach genug ist, können Sie auch eine bedingte Verwendung im ng-umfassen z.B.

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

Das ist, was ich wollte, ziehe ich meine partiellen Vorlagen über AMD, und dann kann der Controller sie in die $ templateCache assemblieren und verwenden ng-include = "'myTpl" – httpete

+1

Fantastische Arbeit herum. Um lazy zu laden, füge ich einfach ein "ng-if" in das Include ein und setze die Variable nach dem Auffüllen der Vorlage auf true. –

6

Sie können das nicht mit ng-include; Referenz:

ngInclude | src - {string} - eckiger Ausdruck, der auf URL auswertet. Wenn die Quelle eine Zeichenfolgenkonstante ist, stellen Sie sicher, dass Sie sie in Anführungszeichen setzen, z. src = "'myPartialTemplate.html'".

Verwenden direkt ng-bind-html-unsafe wie folgt aus:

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

Demo

Erzeugt eine Bindung, die das Ergebnis der Auswertung des Ausdrucks in das aktuelle Element innerHTML-. Der innerHTML-ed Inhalt wird nicht gereinigt werden! Sie sollten diese Direktive nur verwenden, wenn die ngBindHtml Direktive zu restriktiv ist und Sie absolut der Quelle des Inhalts vertrauen, an den Sie gebunden sind.

+0

'ng-bind-html-unsafe' ist veraltet. Weitere Informationen und Alternativen finden Sie unter http://stackoverflow.com/q/19415394/3123195. –

4

können Sie ng-bind-html-unsafe

verwenden Wenn Sie nicht die HTML vertrauen, die sich von Ihrer Ajax-Anforderung kommt, können Sie auch ng-bind-html verwenden, die den $sanitize Service arbeiten muss (DEMO).

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

Um das zu verwenden, müssen Sie an extra js file einschließen.

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

Und natürlich die App in dem ng-App: eine URL zu einem externen HTML-Fragmente

<div ng-app="app"> 
1

ng-include erwartet, nicht ein HTML-String.

Sie wollen ng-bind-html-unsafe:

Updated demo.

+3

ng-bind-html-unsafe würde funktionieren, aber es ist nur nützlich beim Drucken von HTML, nicht HTML, das erneut mit ng-binds kompiliert werden muss und was nicht drin ist. Allerdings habe ich es gelöst, indem ich das templatecache-Beispiel von @quinnirill verwendet habe, da dies eine sehr saubere Lösung ist, ohne dass das HTML extra kompiliert werden muss. immer noch danke für die Idee – Sander