关于angularjs:何时支持ng-if vs.

When to favor ng-if vs. ng-show/ng-hide?

我知道ng-showng-hide影响元素的类集,并且ng-if控制元素是否作为DOM的一部分呈现。

有没有选择ng-if而不是ng-showng-hide的指导方针?


取决于您的用例,但要总结区别:

  • ng-if将从dom中删除元素。这意味着所有附加到这些元素的处理程序或任何其他内容都将丢失。例如,如果将click处理程序绑定到某个子元素,当ng-if的计算结果为false时,该元素将从dom中删除,并且您的click处理程序将不再工作,即使在ng-if之后的计算结果为true并显示该元素。您需要重新附加处理程序。
  • ng-show/ng-hide不从dom中删除元素。它使用CSS样式隐藏/显示元素(注意:您可能需要添加自己的类)。这样就不会丢失附加到孩子身上的处理程序。
  • ng-if creates a child scope while ng-show/ng-hide does not
  • ng-show/ng-hide相比,不在dom中的元素对性能的影响较小,并且您的web应用程序在使用ng-if时可能更快。根据我的经验,两者之间的差别是微不足道的。在使用ng-show/ng-hideng-if时,动画是可能的,在角度文档中都有示例。

    最后,您需要回答的问题是是否可以从DOM中删除元素?


    请参阅此处获取一个代码笔,它演示了ng if/ng显示如何工作的差异,以及dom-wise。

    @马尔可夫卡萨诺维奇很好地回答了这个问题。但我从另一个角度来看:我总是使用ng-if并从dom中获取这些元素,除非:

  • 出于某种原因,您需要元素上的数据绑定和$watches,以便在它们不可见时保持活动状态。如果您希望能够检查当前不可见的输入的有效性,那么表单可能是一个很好的例子,以确定整个表单是否有效。
  • 正如上面提到的,您使用的是一些非常复杂的状态逻辑和条件事件处理程序。也就是说,如果您发现自己手动附加和分离处理程序,从而在使用ng-if时丢失了重要状态,那么您可以问问自己,在数据模型中是否更好地表示该状态,并且每当呈现元素时,处理程序都有条件地由指令应用。换句话说,处理程序的存在/不存在是状态数据的一种形式。将数据从DOM中取出并放入模型中。处理程序的存在/不存在应由数据决定,因此易于重新创建。
  • 角度写得很好。考虑到它的作用,它很快。但它所做的是一系列的魔法,使困难的事情(如双向数据绑定)看起来非常简单。使所有这些事情看起来简单需要一些性能开销。您可能会惊讶地发现,在没有人看到的一大块DOM上,一个setter函数在$digest周期中被评估了成百上千次。然后你意识到你有几十或数百个不可见的元素都在做同样的事情…

    台式机可能确实足够强大,可以使大多数JS的执行速度问题不受影响。但是,如果你正在开发手机,那么只要人类有可能,使用ng应该是一个很简单的方法。JS速度在移动处理器上仍然很重要。使用ng if是一种非常简单的方法,可以以非常、非常低的成本获得潜在的显著优化。


    根据我的经验:

    1)如果您的页面具有使用ng if/ng show显示/隐藏某些内容的切换,则ng if会导致更多浏览器延迟(较慢)。例如:如果您有一个按钮用于在两个视图之间切换,则ng-show似乎更快。

    2)当评估为真/假时,ng if将创建/销毁作用域。如果有一个控制器连接到ng if,那么每次ng if的计算结果为true时,都会执行该控制器代码。如果使用ng show,则控制器代码只执行一次。因此,如果您有一个按钮可以在多个视图之间切换,那么使用ng if和ng show将在编写控制器代码的方式上产生巨大的差异。


    答案并不简单:

    它取决于目标机器(移动与桌面),取决于数据的性质,浏览器,操作系统,运行的硬件…如果你真的想知道的话,你需要做基准测试。

    这主要是一个内存与计算的问题…与大多数性能问题一样,重复元素(n)类列表的差异可能变得非常显著,尤其是在嵌套(n x n或更糟)时,以及在这些元素中运行的计算类型:

    • ng-show:如果这些可选元素经常出现(密集),比如说90%的时间,准备好它们并只显示/隐藏它们可能会更快,尤其是当它们的内容很便宜时(只是纯文本,不需要计算或加载)。这会消耗内存,因为它用隐藏的元素填充DOM,但是只显示/隐藏已经存在的内容对于浏览器来说可能是一个便宜的操作。

    • ng-if:如果相反,元素很可能不会显示(稀疏),那么只需实时构建并销毁它们,尤其是当它们的内容很昂贵时(计算/排序/过滤、图像、生成的图像)。这是稀有元素或"按需"元素的理想选择,它可以节省内存,而不会填充DOM,但会花费大量的计算(创建/销毁元素)和带宽(获取远程内容)。它还取决于您在视图中计算的量(过滤/排序)与您在模型中已经拥有的量(预先排序/预先过滤的数据)。


    一个重要注意事项:

    ngif(与ngshow不同)通常创建可能产生意外结果的子作用域。

    我有一个与此相关的问题,我花了很多时间来弄清楚到底发生了什么。

    (我的指令将其模型值写入了错误的范围。)

    所以,如果你跑得太慢,就用ngshow来保存你的头发。

    不管怎样,性能差异几乎不明显,我还不确定在没有测试的情况下谁会喜欢它…


    如果使用ng-show or ng-hide,则无论表达式的值如何,都将加载内容(例如来自服务器的缩略图),但将根据表达式的值显示内容。

    如果使用ng-if,只有当ng if的表达式计算为truthy时,才会加载内容。

    在将要从服务器加载数据或图像并仅根据用户交互显示这些数据或图像的情况下,使用ng-if是一个好主意。这样页面加载就不会被不必要的nw密集型任务阻塞。


    ng如果在ng上包括和在ng控制器上会有很大的影响。在ng include上,它不会加载所需的部分,除非标志为true,否则不会处理。在NG控制器上,除非标志为真,否则不会加载控制器。但问题是,当一个标志在ng中变为假时,如果它在flag变为真时从dom中移除,它将重新加载dom,在这种情况下,ng show更好,一次性show ng if更好