【问题标题】:AngularJS ng-if directive briefly renders even when condition is false before removing element即使在删除元素之前条件为假,AngularJS ng-if 指令也会短暂呈现
【发布时间】:2023-03-14 03:08:01
【问题描述】:

在下面的模板中,我希望脚本标签永远不会呈现,并且警报脚本永远不会执行。但是确实如此。

<div ng-if="false">
    <script>alert('should not run')</script>
    Should not appear
</div>

这导致我们在移动设备上出现巨大的性能问题,因为我们将大型 DOM 和指令结构包装在 ng-ifs 中,并期望在条件为 false 时它们不会呈现。

我还测试了ng-switch,它的行为方式相同。

这是预期的行为吗?有没有办法避免不必要的渲染?

JSFiddle

【问题讨论】:

标签: javascript angularjs angularjs-directive angular-ng-if


【解决方案1】:

它可能看起来落后,但ngIf 更多地处理 DOM 的删除,而不是添加。在控制器完成实例化之前,DOM 仍然存在。这通常是一件好事,并且允许您为没有 JS(或者,初始加载状态)的用户进行优雅降级。

如果您不想渲染内部 DOM,请将其放置在指令中(可以是它自己的指令,也可以通过 ng-include)或视图中。

示例 1(了解脚本运行的原因):

为了帮助自己更好地理解流程,您可以将示例更新为:

<div ng-if="false">
    {{"Should not appear"}}
    <script>alert('should not run')</script>
</div>    

https://jsfiddle.net/hLw0nady/6/embedded/result/

您会注意到,当警报弹出时,Angular 尚未插入“不应出现”(它出现在其大括号中)。但是,在您解除警报后,它就会消失。

示例 2(如何防止警报):

可以在此处查看在 directive 中隐藏“不应运行”的代码的示例:https://jsfiddle.net/hLw0nady/4/

在此示例中,只有将 ng-if="false" 替换为 ng-if="true" 才会收到警报。

【讨论】:

    【解决方案2】:

    我认为 false 表达式没有很好地转换为 angular false。 我可以通过设置来证明这一点:

    <div ng-if="!true">
    

    不会在当前 div 中呈现文本。 无论如何,它执行警报,我想它是在角度运行之前执行的,这就是原因。

    【讨论】:

    • 还是不行:jsfiddle.net/hLw0nady/5。你不明白问题所在。无论您在此ngIf 中放置什么,都会注入 base-DOM。它将包括脚本。被注入是好事!这是设计使然,如果 Angular 未加载或出现其他问题,您可以显示后备元素。
    猜你喜欢
    • 2018-02-02
    • 1970-01-01
    • 2017-01-28
    • 1970-01-01
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多