答案并不简单: 这取决于目标机器(移动的与台式机),取决于数据的性质、浏览器、操作系统、运行它的硬件......如果您真的想知道,您需要进行基准测试。 这主要是一个内存与计算的问题......与大多数性能问题一样,对于重复的元素(n)(如列表),尤其是当嵌套(n x n,或更糟)时,差异可能会变得很大,同时还需要考虑在这些元素中运行的计算类型:
如果使用ng-show or ng-hide,则无论表达式的值如何,都将加载内容(例如,服务器中的缩略图),但将根据表达式的值显示内容。 如果使用ng-if,则仅当ng-if的表达式计算结果为true时,才会加载内容。 如果你要从服务器加载数据或图像,并根据用户交互来显示它们,那么使用ng-if是一个好主意。这样你的页面加载就不会被不必要的网络密集型任务阻塞。
7条答案
按热度按时间jdzmm42g1#
取决于您的使用情形,但总结一下区别:
ng-if
将从DOM中删除元素。这意味着所有处理程序或附加到这些元素的任何其他内容都将丢失。例如,如果将单击处理程序绑定到一个子元素,当ng-if
的值为false时,该元素将从DOM中删除,并且单击处理程序将不再工作。即使在ng-if
稍后计算为true并显示该元素之后也是如此。您需要重新附加该处理程序。ng-show/ng-hide
不会从DOM中删除元素。它使用CSS样式隐藏/显示元素(注意:你可能需要添加你自己的类)。2这样你的处理程序就不会丢失。ng-if
创建子作用域,而ng-show/ng-hide
不创建不在DOM中的元素对性能的影响较小,使用
ng-if
时Web应用的运行速度可能比使用ng-show/ng-hide
时快。根据我的经验,这种差异可以忽略不计。同时使用ng-show/ng-hide
和ng-if
时,动画都是可能的,Angular文档中有这两种情况的示例。最后,您需要回答的问题是是否可以从DOM中删除元素?
hc2pp10m2#
请参阅here,以了解演示ng-if/ng-show在DOM方面如何工作的差异的CodePen。
@markovuksanovic很好地回答了这个问题。但我会从另一个Angular 来看待这个问题:我 * 总是 * 使用
ng-if
并从DOM中获取这些元素,除非:1.出于某种原因,您需要元素上的数据绑定和
$watch
-es在不可见时保持活动状态。如果您希望能够检查当前不可见的输入的有效性,以确定整个表单是否有效,那么表单可能是一个很好的例子。1.如上所述,您正在使用一些非常复杂的有状态逻辑和条件事件处理程序。* 也就是说 *,如果您发现自己手动地附加和分离处理程序,从而在使用ng-if时丢失了重要的状态,那么请问问自己,是否可以在数据模型中更好地表示该状态,以及在呈现元素时由指令有条件地应用处理程序。换句话说,处理程序的存在/不存在是一种状态数据。2从DOM中获取数据,并将其放入模型中。3处理程序的存在/不存在应该由数据来确定,因此很容易重新创建。
Angular写得很好,很快考虑到它的作用。但它所做的是一大堆魔法,使困难的事情(比如双向数据绑定)看起来非常简单。让所有这些看起来简单需要一些性能开销。你可能会震惊地发现,在
$digest
周期中,一个setter函数在一大块DOM上被计算了数百次或数千次,而没有人会想到这一点。然后你意识到你有几十个或几百个看不见的元素在做同样的事情...台式机可能确实强大到足以解决大多数JS执行速度问题。但如果你是为移动的开发的,那么在任何可能的情况下使用ng-if应该是一个不用动脑筋的问题。JS速度在移动处理器上仍然很重要。使用ng-if是一个非常简单的方法,可以以非常非常低的成本获得潜在的显著优化。
bihw5rsg3#
根据我的经验:
1)如果您的页面有一个使用ng-if/ng-show来显示/隐藏内容的切换,ng-if会导致更多的浏览器延迟(更慢)。例如:如果您有一个按钮用于在两个视图之间切换,ng-show似乎更快。
2)ng-if将创建/销毁作用域,当它的值为true/false时。如果你有一个控制器连接到ng-if,那么每当ng-if值为true时,控制器代码就会被执行。如果你使用ng-show,控制器代码只会被执行一次。所以如果你有一个在多个视图之间切换的按钮,使用ng-if和ng-show会使您编写控制器代码的方式有很大的不同。
zour9fqk4#
答案并不简单:
这取决于目标机器(移动的与台式机),取决于数据的性质、浏览器、操作系统、运行它的硬件......如果您真的想知道,您需要进行基准测试。
这主要是一个内存与计算的问题......与大多数性能问题一样,对于重复的元素(n)(如列表),尤其是当嵌套(n x n,或更糟)时,差异可能会变得很大,同时还需要考虑在这些元素中运行的计算类型:
*ng-show:如果这些可选元素经常出现(密集),比如说90%的时间,让它们准备好,只显示/隐藏它们可能会更快,特别是如果它们的内容很廉价(只有纯文本,不需要计算或加载)。这会消耗内存,因为它会用隐藏的元素填充DOM,但是只显示/隐藏已经存在的东西对浏览器来说可能是一个廉价的操作。
*ng-if:如果相反,则元素可能不显示(稀疏)只需真实的构建和销毁它们,特别是如果它们的内容获取成本很高的话(计算/排序/过滤、图像、生成的图像)。这对于稀有或“按需”元素是理想的,由于不填充DOM,因此它节省了内存,但会消耗大量计算(创建/销毁元素)和带宽(获取远程内容)。它还取决于您在视图中计算(过滤/排序)的量与您在模型中已经拥有的(预排序/预过滤数据)的量。
oknwwptz5#
一个重要注意事项:
ngIf(与ngShow不同)通常会创建可能产生意外结果的子作用域。
我有一个与此相关的问题,我花了很多时间来弄清楚是怎么回事。
(My指令将其模型值写入错误的范围。)
所以,为了保存你的头发只要使用ngShow,除非你跑得太慢。
性能差异是几乎没有注意到无论如何,我还不确定谁的青睐是没有测试...
3okqufwl6#
如果使用
ng-show or ng-hide
,则无论表达式的值如何,都将加载内容(例如,服务器中的缩略图),但将根据表达式的值显示内容。如果使用
ng-if
,则仅当ng-if的表达式计算结果为true时,才会加载内容。如果你要从服务器加载数据或图像,并根据用户交互来显示它们,那么使用ng-if是一个好主意。这样你的页面加载就不会被不必要的网络密集型任务阻塞。
n53p2ov07#
ng-if对ng-include和ng-controller将有很大的影响。在ng-include上,它不会加载所需的部分,也不会进行处理,除非在ng-controller上标志为真,否则它不会加载控制器,除非标志为真,但问题是,当ng-if中的标志为假时,它将从DOM中删除,当标志返回为真时,它将重新加载DOM。在这种情况下,ng-show更好。有一次显示ng-if更好