ng-react 比 ng-repeat 慢得多(不推荐访问 属性 'nodeType' 错误)
ng-react much slower than ng-repeat (deprecated access to property 'nodeType' error)
当我修改我的 $watched 对象数组时,我正在尝试使用 ngReact 而不是 ngRepeat 来提高性能。
react 组件有效,html 正确显示。对于控制器中包含的每个标记,我想创建一个 <button>
,其中 marker.title
作为文本。
然而它超级慢,比 ngRepeat 慢得多,并且控制台显示相同错误的无限列表:
[Error] Deprecated attempt to access property 'nodeType' on a non-Node object.
n (angular.min.js, line 7)
sa (angular.min.js, line 11)
$digest (angular.min.js, line 129)
$apply (angular.min.js, line 132)
l (angular.min.js, line 85)
O (angular.min.js, line 89)
(funzione anonima) (angular.min.js, line 90)
m (angular.min.js, line 89)
这是我的 React 组件(在我的 post 末尾,有 JSfiddle link)
HTML
<!-- ctrl is the controller, having a list of markers -->
<poi-list list="ctrl.getMarkers()" ctrl="ctrl"/>
JS
.value( "PoiList", React.createClass( {
propTypes : {
list: React.PropTypes.object.isRequired,
ctrl: React.PropTypes.object.isRequired
},
render: function()
{
var ctrl = this.props.ctrl; // directive's Controller
var markers = this.props.list.map( function( marker, i )
{//for each marker, create a button
return React.DOM.button( {
className:'btn btn-default',
onClick: function(){ctrl.doSomething(marker);},
onMouseOver: function(){ctrl.doSomethingElse(marker);},
}, marker.title
) ;
} );
return React.DOM.div(null, markers);
}
}))
.directive( 'poiList', function( reactDirective ) {
return reactDirective( 'PoiList' );
} );
this is a (new version) JSFiddle 我的问题。简要说明:
- 有一个 MapBox 指令,用于在页面上显示地图。 1 秒后,它在地图上加载 3 个标记,以模拟 ajax 请求。
- 对于每个加载的标记,它会推入 PanelController
的 list
,它负责在左侧面板上显示标记的名称。名称由 React 组件显示,使用 ng-React。它可以工作,但是有一个错误会减慢整个系统的速度。
知道问题出在哪里吗?
谢谢
感谢对我问题的评论,我发现真正的问题不是 Safari 控制台显示的已弃用错误,而是递归 $digest 循环的问题。使用 Chrome,显示正确的错误。但是我还没有解决这个问题,所以我发布了一个 。
谢谢
当我修改我的 $watched 对象数组时,我正在尝试使用 ngReact 而不是 ngRepeat 来提高性能。
react 组件有效,html 正确显示。对于控制器中包含的每个标记,我想创建一个 <button>
,其中 marker.title
作为文本。
然而它超级慢,比 ngRepeat 慢得多,并且控制台显示相同错误的无限列表:
[Error] Deprecated attempt to access property 'nodeType' on a non-Node object.
n (angular.min.js, line 7)
sa (angular.min.js, line 11)
$digest (angular.min.js, line 129)
$apply (angular.min.js, line 132)
l (angular.min.js, line 85)
O (angular.min.js, line 89)
(funzione anonima) (angular.min.js, line 90)
m (angular.min.js, line 89)
这是我的 React 组件(在我的 post 末尾,有 JSfiddle link)
HTML
<!-- ctrl is the controller, having a list of markers -->
<poi-list list="ctrl.getMarkers()" ctrl="ctrl"/>
JS
.value( "PoiList", React.createClass( {
propTypes : {
list: React.PropTypes.object.isRequired,
ctrl: React.PropTypes.object.isRequired
},
render: function()
{
var ctrl = this.props.ctrl; // directive's Controller
var markers = this.props.list.map( function( marker, i )
{//for each marker, create a button
return React.DOM.button( {
className:'btn btn-default',
onClick: function(){ctrl.doSomething(marker);},
onMouseOver: function(){ctrl.doSomethingElse(marker);},
}, marker.title
) ;
} );
return React.DOM.div(null, markers);
}
}))
.directive( 'poiList', function( reactDirective ) {
return reactDirective( 'PoiList' );
} );
this is a (new version) JSFiddle 我的问题。简要说明:
- 有一个 MapBox 指令,用于在页面上显示地图。 1 秒后,它在地图上加载 3 个标记,以模拟 ajax 请求。
- 对于每个加载的标记,它会推入 PanelController
的 list
,它负责在左侧面板上显示标记的名称。名称由 React 组件显示,使用 ng-React。它可以工作,但是有一个错误会减慢整个系统的速度。
知道问题出在哪里吗? 谢谢
感谢对我问题的评论,我发现真正的问题不是 Safari 控制台显示的已弃用错误,而是递归 $digest 循环的问题。使用 Chrome,显示正确的错误。但是我还没有解决这个问题,所以我发布了一个