Angularjs 循环对象、非法的isArrayLike()调用和使用ngReact创建的无限$digest循环
[9月24日更新] 当我修改$watched对象数组时,我尝试使用ngReact而不是ngRepeat来提高性能 对于控制器中包含的每个对象,我要创建一个映射标记,将marker.title作为文本。为此,我用板条箱装了一个React组件,它监视一组标记。这样的标记包含一个列表,每个标记一个。我认为只有修改标记列表,然后修改按钮列表,组件的结果才会改变。但事实并非如此Angularjs 循环对象、非法的isArrayLike()调用和使用ngReact创建的无限$digest循环,angularjs,dom,reactjs,clone,ngreact,Angularjs,Dom,Reactjs,Clone,Ngreact,[9月24日更新] 当我修改$watched对象数组时,我尝试使用ngReact而不是ngRepeat来提高性能 对于控制器中包含的每个对象,我要创建一个映射标记,将marker.title作为文本。为此,我用板条箱装了一个React组件,它监视一组标记。这样的标记包含一个列表,每个标记一个。我认为只有修改标记列表,然后修改按钮列表,组件的结果才会改变。但事实并非如此 [TypeError]: Illegal invocation at isArrayLike (angular.js:274
[TypeError]: Illegal invocation
at isArrayLike (angular.js:274)
at forEach (angular.js:328)
at copy (angular.js:886)
[Error]: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.4.0-rc.0/$rootScope/infdig?p0=10&p1=%5B%5D
at REGEX_STRING_REGEXP (angular.js:68)
at Scope.parent.$get.Scope.$digest (angular.js:15340)
at Scope.parent.$get.Scope.$apply (angular.js:15570)
at (index):95
似乎由React组件创建的列表结果总是不同的,即使是由相同的对象创建的
现在是奇怪的部分。。实际上,我使用Json对象向地图添加标记。当我添加一个Json对象时,映射会创建一个标记对象,而不是Json对象,因为它有一个循环结构。我将这个标记对象添加到我的$watched数组中,以创建相对。。。也许这就是非法的isArrayLike错误的原因
这里是我文章末尾的React组件,还有JSFIDLE链接
HTML
我的问题。简要说明:
$rootScope中有2个数组。临时列表用于临时逐个推送所有标记。m_列表由react组件监视。
有一个MapBox指令及其控制器。对于添加到地图的每个标记,它将被推送到临时列表中。
加载所有标记并完成临时列表后,将其克隆到m_列表,以便更新react组件。
谢谢我找到了解决办法!这个问题不知何故与地图的使用有关。在关注的数组中,我没有添加Json标记,而是添加由MapBox创建的对象标记
map.featureLayer.setGeoJSON(json_markers_list); // I pass an array of Json markers
map.featureLayer.on('layeradd', function(e)
{
var marker = e.layer; // marker is anymore a json obj
ctrl.pushMarker(marker); // marker now has a cyclic structure
});
由MapBox创建的对象标记具有循环结构。因此,React无法知道自上次检查以来旧的$watched数组是否已更改,因为当存在循环结构时,它无法执行isArrayLike。因此,它在任何浏览器中都会出现不同的错误,并认为数组始终在更改,从而生成$digest无限迭代
我的解决方案是使用一个数组和一个映射。数组是$watched,只包含我需要在按钮中显示的信息
{'title': 'marker title', 'id':00001}
地图包含真实的标记对象
{'00001' : {markerObj}}
这是一个有效的方法!单击按钮,将选择标记对象
这个问题和解决方案也张贴在论坛上
{'title': 'marker title', 'id':00001}
{'00001' : {markerObj}}