Пытался загрузить Angular Больше, чем однажды

У меня есть приложение для висячего леса (генератор полных сталей angular).

grunt serve работает отлично, но grunt build создает дистрибутив, который блокирует память, скорее всего, из-за круговых ссылок в angular.

Я обновил angular до 1.2.15. Ошибка, которую я получаю:

WARNING: Tried to Load Angular More Than Once

До обновления ошибка:

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

Это довольно сложно отлаживать, поскольку это происходит только после сборки/минимизации. Все мои модули находятся в формате массива angular, поэтому инициализация DI не должна быть проблемой, но она есть.

Нет ни одного script, который вызывает это. Единственный способ уйти - это не инициализировать файл app.js. Мой файл app.js находится ниже.

Любая вещь приходит на ум?

'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');

Ответ 1

Это может быть ряд проблем: по существу это проблема routeProvider, которая не находит файл и рекурсивно загружает значение по умолчанию.

Для меня оказалось, что это было не минирование, а конкатенация js, вызвавшая проблемы.

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

Вы заметите, что если приложение не сможет найти файл (т.е. otherwise), он перенаправит его в корневой каталог, который в этом случае загрузит templateUrl. Но если ваш templateUrl ошибочен, это приведет к рекурсии, которая перезагружает index.html загрузку angular (и всего остального) снова и снова.

В моем случае grunt-concat вызвал ошибку templateUrl после сборки, но не раньше.

Ответ 2

Я столкнулся с этой проблемой, когда забыл включить ".html" для представлений.

Пример:

templateUrl: 'views/home'

Должно быть:

templateUrl: 'views/home.html'

Ответ 3

Похоже, никто не упоминал об этом нигде, поэтому вот что вызвало это для меня: У меня была директива ng-view на моем теле. Изменение этого типа

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

остановил ошибку.

Ответ 4

Это не имеет никакого отношения к app.js вообще. Вместо этого это предупреждение регистрируется при включении библиотеки Angular JS более одного раза.

Мне удалось воспроизвести ошибку в этом JSBin. Обратите внимание на два тега script (две разные версии):

<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>

Соответствующий Angular код GitHub.

Ответ 5

У меня была такая же проблема. Проблема заключалась в конфликте между JQuery и Angular. Angular не смог установить полную библиотеку JQuery для себя. Поскольку JQLite в большинстве случаев достаточно, я включил Angular сначала на свою веб-страницу, а затем загрузил JQuery. Ошибка исчезла.

Ответ 6

В моем случае я получал эту ошибку при использовании jquery, а также angular js на странице.

<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>

Я удалил:

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

И предупреждение исчезло.

Ответ 7

Если бы сегодня эта проблема и подумал, я бы опубликовал, как я ее исправил. В моем случае у меня была страница index.html с:

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

и в моем файле app.js у меня был следующий код:

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

В результате, когда я перешел на страницу (base_url/), он загрузил index.html, а внутри ng-view он снова загрузил index.html, и внутри этого вида он снова загрузил index.html.. и так on - создание бесконечной рекурсивной загрузки index.html(каждый раз при загрузке библиотек angular).

Чтобы решить все, что мне нужно было сделать, это удалить index.html из маршрутаProvider - следующим образом:

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

Ответ 8

Я также столкнулся с такой проблемой, когда я постоянно получал бесконечный цикл, и страница перезагружалась бесконечно. После некоторой отладки я обнаружил, что ошибка вызвана, потому что angular был не способен загрузить шаблон, заданный с определенным идентификатором, потому что шаблон не присутствовал в этом файле.

Будьте осторожны с URL-адресом, который вы предоставляете в приложениях angular. Если это не правильно, angular может просто продолжать искать его в конце концов, что приведет к бесконечному циклу!

Надеюсь, это поможет!

Ответ 9

У меня была аналогичная проблема, и для меня проблема была связана с некоторыми недостающими точками с запятой в контроллере. Минимизация приложения, вероятно, приводила к неправильному выполнению кода (скорее всего, полученный код вызывал мутации состояния, что заставляет визуализировать представление, а затем контроллер снова выполняет код и т.д. Рекурсивно).

Ответ 10

У меня была эта проблема с кодовым пером, и это оказалось просто потому, что я загружал JQuery до Angular. Не знаю, может ли это применяться для других случаев.

Ответ 11

Капитализация также важна! В моей директиве я попытался указать:

templateUrl: 'Views/mytemplate'

и получил предупреждение "более одного раза". Предупреждение исчезло, когда я изменил его на:

templateUrl: 'Views/mytemplate'

Исправьте меня, но я думаю, что это произошло потому, что страница, на которую я разместила директиву, находилась под "представлениями", а не "Просмотры" в функции конфигурации маршрута.

Ответ 12

Это случилось со мной и с .NET и MVC 5, и через некоторое время я понял, что внутри метки в файле Index.cshtml:

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

снова включается в сценарии раздела с вами. Чтобы решить проблему на стороне сервера, я верю частичное представление. Что-то вроде:

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

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

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

Ответ 13

У меня была эта же проблема ( "Пытался загрузить Angular Больше, чем один раз" ), потому что я включил дважды файл angularJs (без восприятия) в свой index.html.

<script src="angular.js">
<script src="angular.min.js">

Ответ 14

Вы должны изменить angular route '/'! Это проблема, потому что запрос '/' базового url. Если вы измените '/' = > '/home' или '/hede' angular, то получится хорошая работа.

Ответ 15

У меня была такая же ошибка. Через несколько часов я заметил, что в моем файле .JSON была добавлена ​​дополнительная запятая, в последней паре ключ-значение.

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

Затем я просто снял (последний), и это решило проблему.

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

Ответ 16

Для тех, кто имеет эту проблему в будущем, для меня это вызвано функцией стрелки вместо литерала функции в блоке run:

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

// good
module('a').run(function() {...})

Ответ 17

В моем случае у меня есть index.html, который включает 2 вида i.e view1.html и view2.html. Я разработал эти 2 представления независимо от index.html, а затем попытался внедрить с использованием маршрута. Таким образом, у меня были все файлы script, определенные в 2 файлах html view, которые вызывали это предупреждение. Предупреждение исчезло после удаления включения файлов angularJS script из представлений.

Короче говоря, файлы script angularJS, jQuery и angular -route.js должен быть включен только в index.html и не просматривать html файлы.

Ответ 18

Другим случаем является Webpack, который выполняет concating angular в bundle.js, помимо angular, который загружается из тега index.html <script>.

это произошло из-за того, что мы использовали явный импорт angular во многие файлы:

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

так, webpack решил также расслоить его. очистка всех из них:

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

фиксировало Tried to Load Angular More Than Once за один раз и все.

Ответ 19

Моя проблема заключалась в следующей строке (HAML):

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

Обратите внимание, что у меня есть angular ng-click, и у меня есть тег href, который будет переходить на #, который является той же самой страницей. Мне просто пришлось удалить тег href, и мне было хорошо идти.

Ответ 20

У меня такая же проблема, потому что у меня angular два раза в 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>

Обратите внимание, что предупреждение возникает только тогда, когда режим html5 является истинным, когда мой режим html5 был ложным, я не видел этого предупреждения.

Поэтому удаление первого angular.js решает проблему.

Ответ 21

Проблема для меня заключалась в том, что я сделал резервную копию файла контроллера (js) с некоторыми другими изменениями в одной и той же папке и связал загруженные файлы контроллера (оригинал и резервное копирование js). Удаление резервной копии из папки сценариев, которая была в комплекте, решила проблему.