Einfaches ng-include funktioniert nicht

69

Ich spiele zum ersten Mal mit AngularJS und habe Probleme, ng-include für meine Kopf- und Fußzeilen zu verwenden.

Hier ist mein Baum:

myApp
assets
   - CSS
   - js
        - controllers
        - vendor
             - angular.js
             - route.js
             ......
             ......
             ......
        main.js
pages
   - partials
        - structure
              header.html
              navigation.html
              footer.html
   index.html
   home.html

index.html:

<!DOCTYPE html>
<html ng-app="app">
<head>
    <title>AngularJS Test</title>

    <script src="/assets/js/vendor/angular.js"></script>
    <script src="/assets/js/vendor/route.js"></script>
    <script src="/assets/js/vendor/resource.js"></script>
    <script src="/assets/js/main.js"></script>

</head>
    <body>          

        <div ng-include src="partials/structure/header.url"></div>
        <div ng-include src="partials/structure/navigation.url"></div>    

        <div id="view" ng-view></div>   

        <div ng-include src="partials/structure/footer.url"></div>
    </body>
</html>

main.js

var app = angular.module("app", ["ngResource", "ngRoute"]);


app.config(function($routeProvider) {

$routeProvider.when("/login", {
    templateUrl: "login.html",
    controller: "LoginController"
});

$routeProvider.when("/home", {
    templateUrl: "home.html",
    controller: "HomeController"
});

$routeProvider.otherwise({ redirectTo: '/home'});

});

app.controller("HomeController", function($scope) {
    $scope.title = "Home";
});

home.html

<div>
<p>Welcome to the {{ title }} Page</p>
</div>

Wenn ich auf die home.html-Seite gehe, werden meine Kopf-, Navigations- und Fußzeilen nicht angezeigt.

Oam Psy
quelle
1
mögliches Duplikat von AngularJS ng-include
sp00m

Antworten:

148

Sie machen einen Include-Header. URL statt Header. html . Es sieht so aus, als ob Sie Literale im src-Attribut verwenden möchten, daher sollten Sie sie in Anführungszeichen setzen, wie in den Kommentaren von @DRiFTy erwähnt.

Veränderung

 <div ng-include src="partials/structure/header.url"></div>
 <div ng-include src="partials/structure/navigation.url"></div>    

 <div id="view" ng-view></div>   

 <div ng-include src="partials/structure/footer.url"></div>

zu

 <div ng-include src="'partials/structure/header.html'"></div>
 <div ng-include src="'partials/structure/navigation.html'"></div>    

 <div id="view" ng-view></div>   

 <div ng-include src="'partials/structure/footer.html'"></div>

Wenn dies nicht funktioniert, überprüfen Sie die Browserkonsole, ob 404 vorhanden sind

Pieter Herroelen
quelle
85
Um dies hinzuzufügen, müssen Sie den Pfad in einfache Anführungszeichen setzen:src="'partials/structure/header.html'"
DRiFTy
1
Doh, ich habe vergessen, in der Konsole nach 404 zu suchen. Mein Weg war falsch.
Wels
3
@DiscGolfer Dies sind sehr wichtige Informationen. Ich habe meinen Code ewig überprüft, bevor dies funktionierte! +1
Brad Bird
1
Kann jemand erläutern, warum Sie ein String-Literal übergeben müssen? Scheint wie ein großes GOTCHA, das vermieden werden könnte, vielleicht fehlt mir etwas?
DeBraid
2
Es ist viel flexibler. Ich habe es verwendet, um Funktionsaufrufe einzubetten, die im laufenden Betrieb die entsprechende URL generieren.
Ferruccio
100

Ich hatte ein ähnliches Problem mit einem einfachen ng-include, das nicht gerendert wurde:

<div ng-include="views/footer.html"></div>

Ich habe den Dateipfad in einfache Anführungszeichen gesetzt und er rendert jetzt:

<div ng-include="'views/footer.html'"></div>

cfranklin
quelle
7
Du hast meine Zeit gespart! Vielen Dank
Soundar Rathinasamy
Ich habe dieses Ding durch Treffer und Gerichtsverfahren bekommen. Aber ich weiß immer noch nicht, wozu das 'Innere' gut ist? Warum nur "Probleme schafft
Pankaj
1
Warum passiert das?
Mohammad Kermani
2
Sie müssen Zeichenfolgenliterale (z. B. Ihren Dateipfad) in einfache Anführungszeichen setzen, da alles in den vollständigen Anführungszeichen als Code ausgewertet wird. Ohne die einfachen Anführungszeichen hat der Angular-Compiler also irgendwo eine Funktion mit dem Namen Ihres Dateipfads .
Sean.boyer
18

Ich hatte ein ähnliches Problem, das mich hier landete.

ng-include füllte nicht den Inhalt meines Teils, aber es gab keine Konsolenfehler, noch 404.

dann wurde mir klar, was ich tat.

Fix für mich: Stellen Sie sicher, dass Sie ng-appaußerhalb der haben ng-include! so offensichtlich. der Preis, ein Angular Noob zu sein.

GraehamF
quelle
2
JEEZ, das ist schwer zu finden. Ich weiß, das klingt lächerlich, aber so viele Artikel lassen diesen Teil weg. Sogar ein paar "Hello World" -Tutorials haben es nicht erwähnt. Ich habe diese Antwort gefunden und dann eine funktionierende JSfiddle gefunden, um zu lernen, was ich brauchte <div ng-app>. Absurd.
Clark
Dieser hat mir geholfen. Nicht einmal w3schools erwähnen dies.
Wirlez
2

Ich bin auch auf dieses Problem gestoßen. Und das hat bei mir funktioniert.

Also anstatt dies zu schreiben:<div ng-include="'html/form.htm'"></div>

Sie möchten hinzufügen ng-app="". So sollte es aussehen:<div ng-app="" ng-include="'html/form.htm'"></div>

Tim Anishere
quelle
1
Für die obigen Antworten wurde angenommen, dass die ng-App bereits angewendet wurde und wir ng-include darin verwenden.
Pankaj
Besser ng-app = "myApp" zum öffnenden <html> -Tag hinzufügen, aber nicht zu <div>
DotNet Fan
... oder im Body Tag<body ng-app="">
Christian Luneborg
2

Ich hatte mit dem gleichen Problem zu kämpfen und habe fast alles getan, was in verschiedenen Stapeln empfohlen wurde, aber es hat bei mir nicht funktioniert. Auf der Konsole wurde der Fehler angezeigt:

"Cross-Origin-Anforderungen werden nur für Protokollschemata unterstützt: http, data, chrome, chrome-extension, https, chrome-extension-resource."

Später wurde mir klar, dass ich einen lokalen Webserver (MAMP, WAMP usw.) verwenden muss, damit es funktioniert.

Bitte beachten Sie die obige Fehlermeldung. Möglicherweise verwenden Sie keinen lokalen Webserver, um Ihre Website auszuführen.

Muhammad Ali Mansoor
quelle
2

Ich habe es gerade herausgefunden!

Für mich verwendete ich ein CDN zum Importieren meiner Datei angle.min.js, die anscheinend nicht funktionierte. Ich wechselte zu:

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>

und ng-app=""in meinem Body Tag enthalten:

<body ng-app="">
<div ng-include="'testfile.html'"></div>

und es funktioniert jetzt gut. Prost!

FiringBlanks
quelle
Nein, das funktioniert unter IE11 und Chrome nicht. Funktioniert nur mit FF.
Christian Luneborg
1

Ja, ohne das ''würde ng versuchen, den Inhalt innerhalb des zu bewertenng-include("")

Diese Bewertung ist ein weiterer Grund, warum Sie {{}}diese Richtlinien nicht einfügen.

Achuth ich
quelle
1

ng-include funktioniert nicht sowohl in Chrome als auch im Explorer, sondern in Firefox. Dies kann also zu Kompatibilitätsproblemen führen. Versuchen Sie sicher, den Bericht in Firefox oder Edge oder einem anderen Browser zu generieren.

Himesh VR
quelle
1
Willkommen bei Stackoverflow. Es ist besser, wenn Sie die Seite Wie man antwortet, für zukünftige Bemühungen um einen Stapelüberlauf auschecken. -Danke
Momin
Es ist wahr, dass der Chrome-Browser, der für seine überpräventiven Richtlinien bekannt ist, Skripte blockiert, um Seiten von File: // origin aufzurufen. Aus diesem Grund können Sie in Chrome keine eckigen Partials rendern. Dies ist jedoch eine richtige Annahme und kann Teil der Vielzahl von Ursachen sein, die das Funktionieren von ng-view / ng-include vereiteln können.
Abr001am
0

Auch ich hatte ein ähnliches Problem: Dummer Fehler verursachte IT, ich hatte unten textArea EG:

<textarea cols="3" type="text" id="WarehouseAddress"  class="form-control" > `

Wurde nicht richtig geschlossen Korrigiert unten:

<textarea cols="3" type="text" id="WarehouseAddress"  class="form-control" ></textarea> 

<div ng-switch="vm.frmDOA.isGenerateDebitNote">
                <ng-include src="vm.showupload()"></ng-include>
            </div>

Ich dachte, es zu posten könnte jedem helfen, den ich stundenlang gegraben habe, um es zu lösen ...

Sunil Pandey
quelle
0

Die ng-include-Datei funktioniert nur für Dateien, die vom Webserver abgerufen werden (benötigt etwa den Link http: //mywebsite/myinclude.html ). Es funktioniert nicht, wenn Sie Dateien direkt aus dem lokalen Ordner abrufen (c: \ myinclude.html funktioniert nicht).

James Dsouza
quelle
-1

Die ng-include- Direktive sollte nur normal funktionieren, wenn Sie Ihre Datei über einen Server (localhost oder online) anzeigen und Ihre Datei NICHT direkt im Dateisystem anzeigen anzeigen wie (file: ///yourpath/index.html) anzeigen.

Dieses Beispiel von w3schools sollte gut funktionieren.

Zeeawan
quelle