Javascript 调试角度';s摘要循环:如何找到无限循环的原因?
我目前正在使用惰性加载的内容+控制器编写一些代码。我的代码基本上是这样工作的。然而,由于某些原因,我的版本不起作用,取而代之的是每当angular试图更新它的视图时,我都会得到它 当我从这个简单的重复语句中删除Javascript 调试角度';s摘要循环:如何找到无限循环的原因?,javascript,angularjs,angularjs-ng-repeat,angularjs-ng-include,Javascript,Angularjs,Angularjs Ng Repeat,Angularjs Ng Include,我目前正在使用惰性加载的内容+控制器编写一些代码。我的代码基本上是这样工作的。然而,由于某些原因,我的版本不起作用,取而代之的是每当angular试图更新它的视图时,我都会得到它 当我从这个简单的重复语句中删除ng include时,问题就消失了: <div class="container" ng-repeat="pageName in pageNames"> <div ng-include="pageName"></div> </div>
ng include
时,问题就消失了:
<div class="container" ng-repeat="pageName in pageNames">
<div ng-include="pageName"></div>
</div>
最奇怪的部分:即使页面名
从未分配给作用域,也会发生完全相同的错误。两个作用域(外部和内部控制器的作用域-我都有)都可以完全为空(我与Batarang进行了检查-我只有两个空作用域),并且我仍然会得到错误
我的代码有点太复杂,有太多的其他依赖项,所以在这里发布它是没有意义的。它最纯粹的版本是上面的小提琴。我看不出两者在逻辑上有什么不同。当我用巴塔朗检查我的望远镜时,我也没有看到任何可疑的东西:
- 我没有在我的作用域中使用函数
- 我没有使用
$watch
- 我没有使用
ng模型
我终于发现
history.pushState
把一切都搞砸了。我现在正在寻找替代方案,例如$location
服务。尽管如此,我仍然想知道如何调试这类问题。有什么提示吗?没有直接的方法可以获得在每个摘要中更改的范围变量列表,但是如果您处于紧急调试情况,修改Angular的源代码(暂时)非常简单。$digest代码如下:
如果查看此方法,您将看到对watchLog数组的引用。AngularJS使用它来报告有用的错误消息,当它检测到循环时,就像你得到的一样。您可以轻松地在此处添加几个console.log项,或者维护自己的阵列,以便以后登录或使用调试器进行检查。您还可以在此处设置断点以查看发生了什么
我不清楚为什么history.pushState()与此有关,因为您最初的问题没有讨论$location、history或相关函数的使用。然而,请注意,当路径不是您所期望的时,创建无限循环是ngInclude的一个非常常见的问题。大量服务器端(例如NodeJS)项目被配置为在找不到资源时返回主页/索引页,因为它们假定有前端路由正在进行。这实际上是一个巨大的问题,因为你最终会将你的主页嵌入到你的主页中,然后再嵌入另一个副本,等等。我看到这种问题大约每周在s/O上发布一次
对此的一个简单测试是改变服务器,为未找到的任何资源返回一个空的404。每当有人提到“无限循环”和任何类型的资产加载操作:ui路由器、ngRoute、ngInclude等时,我总是建议这样做
这在路径中使用相对URL时尤其常见。有什么原因不能在开发环境中使用未统一版本的angularjs,而只在其摘要()函数中设置断点?将devtools设置为在所有异常(包括捕获的异常)上中断。如果您一直在使用缩微代码,请删除缩微或漂亮地打印javascript。