Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 调试角度';s摘要循环:如何找到无限循环的原因?_Javascript_Angularjs_Angularjs Ng Repeat_Angularjs Ng Include - Fatal编程技术网

Javascript 调试角度';s摘要循环:如何找到无限循环的原因?

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>

我目前正在使用惰性加载的内容+控制器编写一些代码。我的代码基本上是这样工作的。然而,由于某些原因,我的版本不起作用,取而代之的是每当angular试图更新它的视图时,我都会得到它

当我从这个简单的重复语句中删除
ng include
时,问题就消失了:

<div class="container" ng-repeat="pageName in pageNames">
  <div ng-include="pageName"></div>
</div>

最奇怪的部分:即使
页面名
从未分配给作用域,也会发生完全相同的错误。两个作用域(外部和内部控制器的作用域-我都有)都可以完全为空(我与Batarang进行了检查-我只有两个空作用域),并且我仍然会得到错误

我的代码有点太复杂,有太多的其他依赖项,所以在这里发布它是没有意义的。它最纯粹的版本是上面的小提琴。我看不出两者在逻辑上有什么不同。当我用巴塔朗检查我的望远镜时,我也没有看到任何可疑的东西:

  • 我没有在我的作用域中使用函数
  • 我没有使用
    $watch
  • 我没有使用
    ng模型
我的结论是,我并没有明确地改变任何事情,所以它一定是一个有棱角的帽子下的东西

我能不能让Angular或Batarang告诉我在摘要迭代之后哪些作用域变量发生了变化,这样我就可以找出导致无限循环的罪魁祸首

更新:


我终于发现
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。