Javascript 即使在移除元素之前条件为false,AngularJS ng if指令也会短暂呈现
在下面的模板中,我希望脚本标记永远不会呈现,而警报脚本永远不会执行。不管怎样Javascript 即使在移除元素之前条件为false,AngularJS ng if指令也会短暂呈现,javascript,angularjs,angularjs-directive,angular-ng-if,Javascript,Angularjs,Angularjs Directive,Angular Ng If,在下面的模板中,我希望脚本标记永远不会呈现,而警报脚本永远不会执行。不管怎样 <div ng-if="false"> <script>alert('should not run')</script> Should not appear </div> 警报('不应运行') 不应该出现 这在移动设备上给我们带来了巨大的性能问题,因为我们将大型DOM和指令结构包装在ng ifs中,期望它们在条件为false时不会呈现 我还测试了ng
<div ng-if="false">
<script>alert('should not run')</script>
Should not appear
</div>
警报('不应运行')
不应该出现
这在移动设备上给我们带来了巨大的性能问题,因为我们将大型DOM和指令结构包装在ng if
s中,期望它们在条件为false时不会呈现
我还测试了ng开关,其行为方式与此相同
这是预期的行为吗?有没有办法避免不必要的渲染
它可能看起来很落后,但是
ngIf
更多地处理DOM的删除,而不是添加。在控制器完成实例化之前,DOM仍然存在。这通常是一件好事,并允许您在没有JS(或者初始加载状态)的情况下对用户进行优雅的降级
如果不希望呈现内部DOM,请将其放置在指令(它自己的指令或通过ng include
)或视图中
示例1(理解脚本运行的原因):
为了更好地理解流程,您可以将示例更新为:
<div ng-if="false">
{{"Should not appear"}}
<script>alert('should not run')</script>
</div>
{{“不应出现”}
警报('不应运行')
您会注意到,当警报弹出时,Angular尚未插入“不应出现”(它出现在大括号中)。但是,在解除警报后,警报将消失
示例2(如何防止警报):
在指令
中隐藏“不应运行”的代码的示例可在此处查看:
在本例中,仅当您将
ng if=“false”
替换为ng if=“true”
时,您才会收到警报。我认为false表达式不能很好地转换为angular false。
我可以通过以下设置来证明这一点:
<div ng-if="!true">
它不会呈现当前div中的文本。
无论如何,它执行警报,我想它是在角度运行之前执行的,这就是为什么 你读过这个吗?尝试仍然无效:。你不明白这个问题。无论您在这个ngIf
中放置什么,基本DOM都将被注入。它将包括脚本。注射是件好事!它是经过设计的,允许您在Angular未加载或出现其他问题时显示后备元素。