[英]Tried to Load Angular More Than Once
我有一个自耕农脚手架应用程序(角度全栈生成器)。
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 不应该是一个问题,但它是。
没有单一的脚本会导致这种情况。 它消失的唯一方法是我不使用我的 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');
这可能是许多问题:本质上是 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 在构建后出错,但之前没有。
当 $templateCacheProvider 尝试解析 templateCache 中的模板或通过不存在的项目目录时,可能会出现此问题
例子:
templateUrl: 'views/wrongPathToTemplate'
应该:
templateUrl: 'views/home.html'
这与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>
GitHub 上的相关 Angular 代码。
似乎没有人在任何地方提到过这一点,所以这就是触发它的原因:我的身体上有 ng-view 指令。 像这样改变它
<body layout="column">
<div ng-view></div>
...
</body>
停止了错误。
我也面临这样一个问题,我不断地进入无限循环,页面无限地重新加载。 经过一些调试后,我发现错误是由于 angular无法加载具有特定 id 的模板,因为该模板不存在于该文件中。
请注意您在 Angular 应用程序中提供的 url。 如果它不正确,angular 最终只能继续寻找它,导致无限循环!
希望这可以帮助!
我有同样的问题,问题是 JQuery 和 Angular 之间的冲突。 Angular 无法为自己设置完整的 JQuery 库。 由于 JQLite 在大多数情况下就足够了,我首先在我的网页中包含了 Angular,然后我加载了 Jquery。 那个时候错误就消失了。
在我的情况下,我在页面上使用 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>
然后警告消失了。
今天遇到了这个问题,我想我会发布我是如何修复它的。 就我而言,我有一个 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 的无限递归加载(每次加载角度库)。
要解决我所要做的就是从 routProvider 中删除 index.html - 如下:
$routeProvider.when('/other', {
controller : 'otherController',
templateUrl : 'views/other.html',
title : 'other'
}).otherwise({
redirectTo : '/'
});
我有一个类似的问题,对我来说,问题是由于控制器中缺少一些分号。 应用程序的缩小可能导致代码执行不正确(很可能结果代码导致状态突变,导致视图呈现,然后控制器再次执行代码,以此类推)。
我在代码笔上遇到了这个问题,结果证明这只是因为我在 Angular 之前加载了 JQuery。 不知道其他情况下能不能用。
大小写也很重要! 在我的指令中,我尝试指定:
templateUrl: 'Views/mytemplate'
并收到“不止一次”警告。 当我将其更改为时,警告消失了:
templateUrl: 'views/mytemplate'
纠正我,但我认为这是因为我放置指令的页面在路由配置功能中的“视图”下而不是“视图”下。
这也发生在我身上 .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();
}
}
我遇到了同样的问题(“尝试多次加载 Angular”),因为我在 index.html 中包含了两次 angularJs 文件(没有感知)。
<script src="angular.js">
<script src="angular.min.js">
我有同样的问题,因为我在index.html
有两次angular
:
<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
模式为 true 时出现,当我的html5
模式为 false 时,我没有看到此警告。
所以删除第一个angular.js
解决了这个问题。
你必须改变角度路线'/'! 这是一个问题,因为 '/' 基本 url 请求。 如果您更改 '/' => '/home' 或 '/hede' angular 会很好地工作。
对于将来遇到此问题的任何人,对我来说,它是由箭头函数而不是run
块中的函数文字引起的:
// bad
module('a').run(() => ...)
// good
module('a').run(function() {...})
就我而言,我有 index.html,它嵌入了 2 个视图,即 view1.html 和 view2.html。 我开发了这两个独立于 index.html 的视图,然后尝试使用路由嵌入。 所以我在导致此警告的 2 个视图 html 文件中定义了所有脚本文件。 从视图中删除包含 angularJS 脚本文件后,警告消失了。
简而言之,脚本文件 angularJS、jQuery 和 angular-route.js 应该只包含在 index.html 中,而不应该包含在视图 html 文件中。
另一种情况是Webpack
将 angular 连接到 bundle.js 中,除了从 index.html <script>
标签加载的 angular。
这是因为我们在许多文件中使用了angular
显式导入:
define(['angular', ...], function(angular, ...){
所以,webpack 也决定捆绑它。 将所有这些清理成:
define([...], function(...){
正在修复Tried to Load Angular More Than Once
多次Tried to Load Angular More Than Once
一劳永逸。
我的问题是以下行(HAML):
%a{"href"=>"#", "ng-click" => "showConfirmDeleteModal()"} Delete
请注意,我有一个有角度的ng-click
并且我有一个href
标签,它将跳转到#
同一个页面。 我只需要删除href
标签就可以了。
对我来说的问题是,我备份了控制器 (js) 文件,并在同一文件夹中进行了一些其他更改,并且捆绑加载了控制器文件(原始和备份 js)。 从捆绑的脚本文件夹中删除备份解决了这个问题。
我遇到了完全相同的错误。 几个小时后,我注意到我的 .JSON 文件中有一个额外的逗号,位于最后一个键值对上。
//doesn't work
{
"key":"value",
"key":"value",
"key":"value",
}
然后我把它取下来(最后一个',')就解决了这个问题。
//works
{
"key":"value",
"key":"value",
"key":"value"
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.