Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.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
Angularjs 循环对象、非法的isArrayLike()调用和使用ngReact创建的无限$digest循环_Angularjs_Dom_Reactjs_Clone_Ngreact - Fatal编程技术网

Angularjs 循环对象、非法的isArrayLike()调用和使用ngReact创建的无限$digest循环

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

[9月24日更新]

当我修改$watched对象数组时,我尝试使用ngReact而不是ngRepeat来提高性能

对于控制器中包含的每个对象,我要创建一个映射标记,将marker.title作为文本。为此,我用板条箱装了一个React组件,它监视一组标记。这样的标记包含一个列表,每个标记一个。我认为只有修改标记列表,然后修改按钮列表,组件的结果才会改变。但事实并非如此

[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}}