Versucht, Winkel mehr als einmal zu laden

74

Ich habe eine Yeoman-Gerüst-App (den eckigen Fullstack-Generator).

grunt servefunktioniert einwandfrei, grunt builderzeugt jedoch eine Verteilung, die den Speicher blockiert, höchstwahrscheinlich aufgrund von Zirkelverweisen im Winkel.

Ich habe Winkel auf aktualisiert 1.2.15. Der Fehler, den ich bekomme, ist:

WARNING: Tried to Load Angular More Than Once

Vor dem Upgrade war der Fehler:

Error: 10 $digest() iterations reached. Aborting!

Das Debuggen ist ziemlich schwierig, da es erst nach dem Erstellen / Minimieren erfolgt. Alle meine Module haben das Array-Format von Angular, daher sollte die Minimierung DI kein Problem sein, ist es aber.

Es gibt kein einziges Skript, das dies verursacht. Der einzige Weg, wie es verschwindet, ist, wenn ich nicht mit meiner app.js-Datei initialisiere. Meine app.js-Datei befindet sich unten.

Fällt Ihnen etwas ein?

'use strict';

angular.module('myApp', [
  'ngCookies',
  'ngResource',
  'ngSanitize',
  'ngRoute',
  'ngTagsInput',
  'ui.bootstrap',
  'google-maps',
  'firebase'
]);

angular.module('myApp').config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/listing.html',
        controller: 'ListingCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  }]).constant('FIREBASE_URL', 'something');
Kyle
quelle

Antworten:

146

Dies kann eine Reihe von Problemen sein: Im Wesentlichen ist es ein Problem, dass routeProvider keine Datei findet und die Standardeinstellung rekursiv lädt.

Für mich stellte sich heraus, dass es nicht die Minifizierung, sondern die Verkettung der js war, die die Probleme verursachte.

angular.module('myApp').config(['$routeProvider', function ($routeProvider) {
    $routeProvider
      .when('/', {
        templateUrl: 'views/listing.html',
        controller: 'ListingCtrl'
      })
      .otherwise({
        redirectTo: '/'
      });
  }]).constant('FIREBASE_URL', 'something');

Sie werden feststellen, dass die App, wenn sie keine Datei (dh otherwise) finden kann, zum Stammverzeichnis umleitet, das in diesem Fall die Datei lädt templateUrl. Wenn Sie sich templateUrljedoch irren, führt dies zu einer Rekursion, bei der das index.htmlLaden von Winkeln (und allem anderen) immer wieder neu geladen wird .

In meinem Fall hat grunt-concat dazu geführt, dass die templateUrl nach dem Build falsch war, aber nicht vorher.

Kyle
quelle
Ist dieses Problem auch in 1.2.14 aufgetreten?
Sergey Shteyn
Dies war eine großartige Lösung für mein Problem. In meinem Fall verwende ich Asp.Net MVC, um meine Vorlagen zu liefern. Ich habe einen dummen Fehler gemacht, den MVC-Controller mit dem gleichen Namen wie meine Winkelroute zu bezeichnen. Ihre Lösung hat mich gezwungen, jede templateUrl zu testen. Wenn die templateUrl defekt ist (genau wie Ihre Winkelroute), funktioniert sie nicht. Tausend Dank.
Greg Grater
4
+1 für eine einfache Erklärung: "Im Wesentlichen ist es ein Problem, dass routeProvider keine Datei findet und die Standardeinstellung rekursiv lädt."
James Gentes
Ist
Lebensretter! Dies sollte zuerst gehen
Venkat
16

Das Problem kann auftreten, wenn $ templateCacheProvider versucht, eine Vorlage im templateCache oder über Ihr nicht vorhandenes Projektverzeichnis aufzulösen

Beispiel:

templateUrl: 'views/wrongPathToTemplate'

Sollte sein:

templateUrl: 'views/home.html'
gewähren
quelle
2
Vielleicht ist es für jemanden hilfreich. Ich habe diesen Fehler erhalten, als einige Vorlagen nach dem Zusammenführen gelöscht wurden: `<div ng-include =" 'path_to_not_existing_template' "> </ div>`
ryaz
@ryaz ja es war in der Tat die Ursache für das Problem.
Rahul
14

Das hat überhaupt nichts damit zu tun app.js. Stattdessen wird diese Warnung protokolliert, wenn Sie die Angular JS-Bibliothek mehrmals einschließen.

Ich habe es geschafft, den Fehler in diesem JSBin zu reproduzieren . Beachten Sie die beiden Skript-Tags (zwei verschiedene Versionen):

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

Relevanter Winkelcode bei GitHub .

SomeKittens
quelle
4
Ja, das macht Sinn, aber in meinem Fall hatte es tatsächlich mit app.js zu tun - ich habe gerade meine Ergebnisse veröffentlicht.
Kyle
Du bist eine Legende! Dies war in meinem Projekt vom ersten Tag an. Es ist endlich gelöst und jetzt kann ich in Ruhe schlafen. Tausend Dank!
Shayan Khan
14

Es scheint, als hätte niemand dies irgendwo erwähnt. Deshalb hat es für mich ausgelöst: Ich hatte die ng-view-Direktive auf meinem Körper. Ändern Sie es so

<body layout="column">
<div ng-view></div>
...
</body>

hat den Fehler gestoppt.

Christliche Gänse
quelle
Ja, für mich war die Ansicht, wo die <script>Tags für <body>
Angular
Sie sind der Retter
Prashant Pokhriyal
8

Ich war auch mit einem solchen Problem konfrontiert, bei dem ich ständig eine Endlosschleife bekam und die Seite sich unendlich neu lud. Nach einigem Debuggen stellte ich fest, dass der Fehler verursacht wurde, weil Angular die Vorlage mit einer bestimmten ID nicht laden konnte, da die Vorlage in dieser Datei nicht vorhanden war.

Seien Sie vorsichtig mit den URLs, die Sie in eckigen Apps angeben. Wenn es nicht korrekt ist, kann Angular irgendwann einfach weiter danach suchen, was zu einer Endlosschleife führt!

Hoffe das hilft!

Kumar Shubham
quelle
Machte meinen Tag .. Das ist unbestreitbar. Vielen Dank!
Nicolò
6

Ich hatte das gleiche Problem. Das Problem war der Konflikt zwischen JQuery und Angular. Angular konnte nicht die vollständige JQuery-Bibliothek für sich selbst festlegen. Da JQLite in den meisten Fällen ausreicht, habe ich Angular zuerst in meine Webseite aufgenommen und dann Jquery geladen. Der Fehler war dann weg.

Mahdi K.
quelle
Ich bin auch auf dieses Problem gestoßen. Das AngularJS-Skript wurde nach oben verschoben, damit es zuerst geladen und anschließend jquery eingefügt wird. Fehler ist jetzt weg.
Basagabi
6

In meinem Fall wurde dieser Fehler bei der Verwendung von jquery sowie von eckigen js auf der Seite angezeigt.

<script src="http://code.jquery.com/jquery-2.1.3.min.js" type="text/javascript"></script>
<script src="js/angular.js" type="text/javascript"></script>
<script src="js/angular-route.js" type="text/javascript"></script>

Ich entfernte :

<script src="http://code.jquery.com/jquery-2.1.3.min.js" type="text/javascript"></script>

Und die Warnung verschwand.

jGupta
quelle
3
Wenn diese Warnung angezeigt wird, ist dies ein Zeichen dafür, dass Sie möglicherweise versuchen, die Seite rekursiv zu laden. Wenn Sie JQuery entfernen, wird die Warnung möglicherweise ausgeblendet, das Problem kann jedoch weiterhin auftreten, was tatsächlich schlimmer ist.
victor175
1
Dies zu tun versteckte den Fehler auch für mich, aber ich entdeckte später, dass dies das eigentliche Problem war
Hashbrown
5

Hatte dieses Problem heute und dachte, ich würde posten, wie ich es behoben habe. In meinem Fall hatte ich eine index.html Seite mit:

<body ng-app="myApp" ng-controller="mainController"
   <div ng-view></div>
</body>

und in meiner app.js Datei hatte ich den folgenden Code:

$routeProvider.when('/', {
    controller : 'mainController',
    templateUrl : 'index.html',
    title : 'Home'
  }).when('/other', {
    controller : 'otherController',
    templateUrl : 'views/other.html',
    title : 'other'
  }).otherwise({
    redirectTo : '/'
  });

Als ich zur Seite (base_url /) ging, wurde index.html geladen, und in der ng-Ansicht wurde index.html erneut geladen, und in dieser Ansicht wurde index.html erneut geladen. Und so weiter - Erstellen eine unendliche rekursive Ladung von index.html (jedes Mal, wenn Winkelbibliotheken geladen werden).

Um alles zu beheben, musste ich index.html wie folgt aus dem routProvider entfernen:

$routeProvider.when('/other', {
    controller : 'otherController',
    templateUrl : 'views/other.html',
    title : 'other'
  }).otherwise({
    redirectTo : '/'
  });
gilmatisch
quelle
2

Ich hatte ein ähnliches Problem, und für mich war das Problem auf einige fehlende Semikolons im Controller zurückzuführen. Die Minimierung der App führte wahrscheinlich dazu, dass der Code falsch ausgeführt wurde (höchstwahrscheinlich verursachte der resultierende Code Statusmutationen, wodurch die Ansicht gerendert wurde, und dann führte der Controller den Code erneut aus und so weiter rekursiv).

Dia Kharrat
quelle
2

Ich hatte dieses Problem mit dem Codestift und es stellte sich heraus, dass ich JQuery vor Angular geladen habe. Ich weiß nicht, ob dies für andere Fälle gelten kann.

Salix
quelle
1

Kapitalisierung ist auch wichtig! In meiner Direktive habe ich versucht anzugeben:

templateUrl: 'Views/mytemplate'

und bekam die Warnung "mehr als einmal". Die Warnung verschwand, als ich sie änderte in:

templateUrl: 'views/mytemplate'

Korrigieren Sie mich, aber ich denke, dies ist passiert, weil die Seite, auf der ich die Direktive platziert habe, in der Routenkonfigurationsfunktion unter "Ansichten" und nicht unter "Ansichten" stand.

Arman Bimatov
quelle
Ich hatte ein ähnliches Problem: Ich habe diese Fehlermeldung erhalten, als der Pfad zu meiner Vorlage unterbrochen wurde. Danke :)
MalcolmOcean
Macht Sinn! Wenn die Vorlagen-URL ungültig ist, kommt die Core-Index.html in der Antwort vom Server, wenn Fehler nicht richtig behandelt werden, was dazu führen würde, dass die JS enthält
Deepak Thomas
1

Dies passierte mir auch mit .NET und MVC 5 und nach einer Weile wurde mir klar, dass innerhalb des Etiketts in der Datei Index.cshtml:

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

wieder als Abschnitt Skripte enthalten passiert Ihnen. Um das Problem auf der Serverseite zu lösen, gebe ich die Teilansicht zurück. Etwas wie:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Login()
    {
        return PartialView();
    }

    public ActionResult About()
    {
        return PartialView();
    }
}
Joseph
quelle
Vielen Dank! Das war mein Fall und jetzt ist es behoben!
Laguna
1

Ich hatte das gleiche Problem ("Versucht, Angular mehr als einmal zu laden"), weil ich zweimal AngularJs-Datei (ohne Wahrnehmung) in meine index.html aufgenommen hatte.

<script src="angular.js">
<script src="angular.min.js">
Biruel Rick
quelle
1

Ich habe das gleiche Problem, weil ich angularzweimal in index.html:

<script src="https://handsontable.github.io/ngHandsontable/node_modules/angular/angular.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.7/angular.min.js"></script>

Beachten Sie, dass die Warnung nur html5angezeigt wird, wenn der Modus wahr ist. Wenn mein html5Modus falsch war, wurde diese Warnung nicht angezeigt.

Das Entfernen des ersten angular.jslöst also das Problem.

SoftTimur
quelle
0

Sie müssen die Winkelroute '/' ändern! Es ist ein Problem, weil '/' Basis-URL-Anfrage. Wenn Sie den Winkel '/' => '/ home' oder '/ hede' ändern, funktioniert dies gut.

Salih KARAHAN
quelle
0

Für alle, die dieses Problem in Zukunft haben, wurde es für mich durch eine Pfeilfunktion anstelle eines Funktionsliteral in einem runBlock verursacht:

// bad
module('a').run(() => ...)

// good
module('a').run(function() {...})
Bcherny
quelle
Ich hatte das gleiche Problem mit den Pfeilfunktionen, als ich versuchte, meinen Code mit ES6 neu zu schreiben. Wissen Sie, warum Pfeilfunktionen überall funktionieren, außer bei Modul- / Controller- / Service-Deklarationen?
Carrm
0

In meinem Fall habe ich index.html, das 2 Ansichten einbettet, dh view1.html und view2.html. Ich habe diese beiden Ansichten unabhängig von index.html entwickelt und dann versucht, sie mithilfe der Route einzubetten. Also hatte ich alle Skriptdateien in den HTML-Dateien mit 2 Ansichten definiert, die diese Warnung verursachten. Die Warnung verschwand, nachdem AngularJS-Skriptdateien aus den Ansichten entfernt wurden.

Kurz gesagt, die Skriptdateien angleJS, jQuery und angle-route.js sollten nur in index.html und nicht in HTML-Ansichtsdateien enthalten sein.

Einzelgänger
quelle
0

Ein anderer Fall ist der, bei Webpackdem neben dem Winkel, der aus dem <script>Tag index.html geladen wird , ein Winkel in die Datei bundle.js eingefügt wird .

Dies lag daran, dass wir angularin vielen Dateien den expliziten Import von verwendet haben:

define(['angular', ...], function(angular, ...){

Also entschied sich Webpack, es auch zu bündeln. Reinigung all dieser in:

define([...], function(...){

reparierte ein Tried to Load Angular More Than Oncefür allemal.

ET-CS
quelle
0

Mein Problem war die folgende Zeile (HAML):

%a{"href"=>"#", "ng-click" => "showConfirmDeleteModal()"} Delete

Beachten Sie, dass ich einen Winkel habe ng-clickund ein hrefTag, zu dem gesprungen wird, auf #derselben Seite. Ich musste nur das hrefEtikett entfernen und konnte loslegen.

schmudu
quelle
0

Das Problem für mich war, dass ich eine Sicherungskopie der Controller-Datei (js) mit einigen anderen Änderungen im selben Ordner erstellt und beide Controller-Dateien (Original- und Sicherungs-js) gebündelt geladen hatte. Das Entfernen des Backups aus dem mitgelieferten Skriptordner hat das Problem behoben.

iTSrAVIE
quelle
0

Ich hatte dieses Problem, als ein schließendes Tag im HTML fehlte .

Geben Sie hier die Bildbeschreibung ein

Also statt:

<table></table> 

..mein HTML war

<table>...<table>

Versucht, jQuery nach Winkel wie oben erwähnt zu laden. Dies verhinderte die Fehlermeldung, konnte das Problem jedoch nicht wirklich beheben. Und jQuery '.find' hat danach nicht wirklich funktioniert.

Die Lösung bestand darin, das fehlende schließende Tag zu beheben.

Bogmag
quelle
-1

Ich hatte genau den gleichen Fehler. Nach einigen Stunden bemerkte ich, dass meine .JSON-Datei beim allerletzten Schlüssel-Wert-Paar ein zusätzliches Komma enthielt.

//doesn't work
{
    "key":"value",
    "key":"value",
    "key":"value",
}

Dann habe ich es einfach abgenommen (das letzte ',') und das hat das Problem gelöst.

//works
{
    "key":"value",
    "key":"value",
    "key":"value"
}
Rodrigo
quelle