Спробував завантажити Angular більше одного разу


74

У мене є додаток для будівельних лісів (кутовий генератор повних стеків).

grunt serveчудово працює, але grunt buildвидає розподіл, який блокує пам'ять, швидше за все, через кругові посилання в angular.

Я модернізував кутовий до 1.2.15. Я отримую помилку:

WARNING: Tried to Load Angular More Than Once

До оновлення помилка була такою:

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

Налагодити досить складно, оскільки це відбувається лише після складання / мініфікації. Усі мої модулі мають формат масиву angular, тому мініфікація DI не повинна становити проблему, але це так.

Немає єдиного сценарію, який би спричинив це. Єдиний спосіб зникнення - це якщо я не ініціалізую за допомогою файлу 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');

Відповіді:


146

Це може бути низкою проблем: по суті, це проблема маршрутного постачальника, який не знаходить файл і рекурсивно завантажує за замовчуванням.

Для мене виявилося, що проблеми спричинила не мініфікація, а об’єднання 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 після побудови, але не раніше.


чи виникала ця проблема також у 1.2.14?
— Сергій Штейн

Це було чудове рішення мого питання. У моєму випадку я використовую Asp.Net MVC для доставки своїх шаблонів. Я зробив дурну помилку, назвавши контролер MVC тим самим іменем, що і мій кутовий маршрут. Ваше рішення змусило мене протестувати кожен шаблонUrl. Якщо templateUrl порушено (так само, як ваш кутовий маршрут), це не спрацює. Завдяки мільйонів.
— Greg Grater

4
+1 для простого пояснення: "По суті, це проблема того, що routeProvider не знаходить файл і рекурсивно завантажує за замовчуванням."
— Джеймс Гентес,

Це сталося саме зі мною, але потім я потрапив сюди <3
— Yazan Rawashdeh

рятувальник життя! це повинно йти спочатку
— Венкат

16

Проблема може виникнути, коли $ templateCacheProvider намагається вирішити шаблон у шаблоні templateCache або у каталозі вашого проекту, який не існує

Приклад:

templateUrl: 'views/wrongPathToTemplate'

Має бути:

templateUrl: 'views/home.html'

2
Можливо, це комусь буде корисно, я отримав цю помилку, коли деякі шаблони були видалені після злиття: `<div ng-include =" 'path_to_not_existing_template' "> </div>`
— ryaz

@ryaz так, це справді було причиною проблеми.
— rahul

14

Це взагалі не має нічого спільного app.js. Натомість це попередження реєструється, коли ви більше одного разу включаєте бібліотеку Angular JS.

Мені вдалося відтворити помилку в цьому JSBin . Зверніть увагу на два теги сценарію (дві різні версії):

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


4
Так, це має сенс, але насправді це було пов’язано з app.js у моєму випадку - я просто опублікував свої висновки.
— Kyle

Ви легенда! Це було в моєму проекті з першого дня. Це нарешті вирішено, і тепер я можу спати спокійно. Завдяки мільйонів!
— Шаян-хан,

14

Здається, про це ніхто ніде не згадував, тому ось що у мене це викликало: у мене на тілі була директива ng-view. Змінюючи це так

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

зупинив помилку.


так, для мене вигляд повинен бути там, де <script>теги для <body>
— angular

ти спаситель
— Прашант Похріял

8

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

Будьте обережні з URL-адресами, які ви надаєте в кутових програмах. Якщо це неправильно, angular може просто продовжувати шукати його, що призведе до нескінченної петлі!

Сподіваюся, це допомагає!


Зробив мій день .. Це неможливо відлагодити. Дякую!
— Ніколо

6

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


Я також зіткнувся з цим питанням. Перемістив зверху скрипт angularjs, щоб спочатку він завантажився, а потім поставив 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>

І попередження зникло.


3
Якщо з’являється це попередження, це ознака того, що ви, можливо, намагаєтесь завантажити сторінку рекурсивно. Якщо видалити JQuery, попередження може зникнути, але проблема все-таки може виникнути, що насправді гірше.
— victor175

1
це приховувало помилку і для мене, але пізніше я виявив, що це справжня проблема
— Хешбровн

5

Якби ця проблема була сьогодні, і я придумав, що я опублікую, як я її виправив. У моєму випадку у мене була сторінка 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 .. і так далі - створення нескінченне рекурсивне навантаження index.html (при кожному завантаженні кутових бібліотек).

Щоб вирішити все, що мені потрібно було видалити index.html із routeProvider - наступним чином:

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

2

У мене була подібна проблема, і для мене проблема була пов’язана з деякими відсутніми крапками з комою в контролері. Мініфікація програми, ймовірно, спричиняла неправильне виконання коду (швидше за все, результуючий код спричиняв мутації стану, що спричиняло рендерінг подання, а потім контролер виконував код знову і так далі рекурсивно).


2

У мене була ця проблема з кодовою ручкою, і виявилося, це тому, що я завантажував JQuery до Angular. Не знаю, чи може це стосуватися інших випадків.


1

Важливим є також використання великих літер! Всередині моєї директиви я спробував вказати:

templateUrl: 'Views/mytemplate'

і отримав попередження "не раз". Попередження зникло, коли я змінив його на:

templateUrl: 'views/mytemplate'

Виправте мене, але я думаю, що це сталося, тому що сторінка, на якій я розмістив директиву, знаходилась у розділі "views", а не "Views" у функції конфігурації маршруту.


У мене була подібна проблема: з’явилося це повідомлення про помилку, коли шлях до мого шаблону зламався. Дякую :)
— MalcolmOcean

Має сенс! Коли URL-адреса шаблону недійсна, основний index.html надходитиме у відповідь від сервера, якщо помилки не обробляються належним чином, що включає JS
— Deepak Thomas,

1

Це трапилося зі мною також із .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();
    }
}

Дякую! це був мій випадок, і тепер це виправлено!
— Лагуна

1

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

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

1

У мене така сама проблема, тому що я 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вирішує проблему.


0

Ви повинні змінити кутовий маршрут '/'! Це проблема, оскільки запит базової URL-адреси '/'. Якщо ви зміните '/' => '/ home' або '/ hede' angular, це буде добре працювати.


0

Для кожного, хто матиме цю проблему в майбутньому, для мене це було викликано функцією стрілки замість літералу функції в runблоці:

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

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

У мене була та ж проблема з функціями стрілок, коли я намагався переписати свій код за допомогою ES6. Чи знаєте ви, чому функції стрілок працюють скрізь, окрім декларацій модулів / контролерів / служб?
— Carrm

0

У моєму випадку у мене є index.html, який вбудовує 2 подання, тобто view1.html і view2.html. Я розробив ці 2 подання незалежно від index.html, а потім спробував вставити за допомогою route. Тож у мене були визначені всі файли скриптів у файлах html 2 view, що викликало це попередження. Попередження зникло після видалення включення файлів сценарію angularJS із подань.

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


0

Інший випадок - Webpackце прив’язка angular до bundle.js, крім angular, який завантажується з <script>тегу index.html .

це було тому, що ми використовували явний імпорт angularу багатьох файлах:

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

отже, webpack вирішив його також зв’язати. очищення всіх з них у:

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

виправляв Tried to Load Angular More Than Onceраз і назавжди.


0

Моєю проблемою був такий рядок (HAML):

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

Зверніть увагу, що у мене кутовий, ng-clickі у мене є hrefтег, який перейде на #ту саму сторінку. Мені просто довелося зняти hrefмітку, і мені було добре піти.


0

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


0

У мене була ця проблема, коли в html не вистачало закриваючого тегу .

введіть тут опис зображення

Отже, замість:

<table></table> 

.. мій HTML був

<table>...<table>

Спробував завантажити jQuery після angular, як зазначено вище. Це запобігло появі повідомлення про помилку, але насправді не вирішило проблему. А jQuery '.find' згодом насправді не працював ..

Рішенням було виправлення відсутнього закриваючого тегу.


-1

У мене була точно така ж помилка. Через кілька годин я помітив, що у моєму файлі .JSON була остання кома на останній парі ключ-значення.

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

Потім я просто зняв (останнє ','), і це вирішило проблему.

//works
{
    "key":"value",
    "key":"value",
    "key":"value"
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.