Angularjs 1.2.0-rc1中的ngSwitch和ngIf闪烁

时间:2013-08-20 15:19:12

标签: angularjs

最近迁移到1.2.0-rc1并对它非常满意。与ngIf相比,尤其对于ngShow而言,这可能是渲染方面的重大改进。 除非布尔值发生变化,否则会有一些闪烁。请参阅下面的plunkr示例: http://plnkr.co/edit/iYMm0IHZkrRamlaEs9yD?p=preview

在Chrome(第28版)中,您会看到前2个实现会闪烁,而其他2个实现则不会闪烁。 在Firefox上,闪烁很少发生。

这是正常的吗?有没有办法避免这种情况?我应该回去使用ngShow吗?

修改 正如sza所说,ngIf和ngSwitch修改DOM,而ngShow使用css规则来显示/隐藏元素。在角度1.0.7中,ngSwitch已经存在并且已经在修改DOM并且非常好,因为我们使用它代替ngShow以避免昂贵的渲染未显示的内容。 现在,如果你看一下http://plnkr.co/edit/pIpEYZ5K8xvfd9dhAC74?p=preview,你会发现1.0.7的ngSwitch没有闪烁。

我期待的答案可能是“这是正常行为,您使用ngSwitchngIf不应该使用它们,只有静态内容应该显示{ {1}}和ngSwitch“或”这是一个渲染错误,与它一起使用直到它被修复“。当然一个解决方法也很好(@timp,我已经看到了你的答案,但我担心我需要一个有效的例子)。

3 个答案:

答案 0 :(得分:3)

我在谷歌小组上问了同样的问题,答案是它是动画模块中的一个错误: https://groups.google.com/d/msg/angular/Fy-rVdXh5WQ/aqhppEl8Nw0J

删除对动画模块的依赖性将修复闪烁。

答案 1 :(得分:2)

如果你查看源代码,你会发现ngIfngSwitch都与DOM操作有关,而ngShowHide只操纵CSS而不是DOM。

我认为在回流方面,DOM操作比CSS更改略贵,并且在不同的浏览器中可能会有所不同。

答案 2 :(得分:0)

如果您在AngularJS文档页面(link)上尝试ngIf演示,则会在快速切换复选框时遇到与您所描述的问题相同的问题。

如果渲染的改进很重要,请尝试用两个布尔值替换checked。这样,您可以指定首先评估ngIf的顺序。这是一种痛苦,但它确实起到了作用。