我知道Angular中 *ngIf
和 hidden
属性之间的区别:
- ngIf:将元素添加/删除到DOM . 隐藏:只需在DOM中显示/隐藏元素 .
我在 hidden
属性中让它保持在DOM中似乎是正确的 .
我尽可能多地坚持 *ngIf
但是当我尝试访问 *ngIf
模板中的元素时,即使我将 *ngIf
的条件更改为 true
(有时因为我不习惯循环),它有时会发出错误DOM更新) . 在这些情况下,我使用 hidden
属性,而不是因为它似乎是正确的 .
所以关键是,我想知道明确的标准/标准来选择一个而不是另一个 .
非常感谢 .
4 回答
我在Angular文档中为您的问题找到了一些更好的答案 . 希望它能为您提供明确的方法,以便从
*ngIf
和hidden
中找到更好的选择 .来自Angular指南
有两次我有理由选择其中一个:
使用
[hidden]
时选择*ngIf
会导致性能问题(DOM中仍有数百个隐藏标签,可能会导致网站呈现缓慢) .当您仍然需要初始化隐藏组件并将事件传递给它时,选择
[hidden]
,即使您不打算显示它也是如此 .除了这两个规则之外,还有一个问题是你的设置是否合适 .
我举一个例子,说明我在现实生活中找到的每一个:
使用[隐藏]时选择* ngIf会导致性能问题
想象一下,您有一个
Ticket
对象,并通过使用Log
对象列表跟踪对每个故障单的修改 . 每个日志代表一种需要以不同方式呈现的更改(例如:关闭票证会生成显示旧状态和新状态的日志,但是向故障单添加文件会显示文件的预览) .一种可能的实现是使用
[hidden]
,如下所示:然后,对于页面中的每个日志,您将拥有29个隐藏的DOM元素 . 现在,如果您的票证被修改了很多,比如10次修改,您最终会在DOM中使用290个隐藏元素,这些元素将使用内存并且渲染速度较慢 .
在这种情况下,将
[hidden]
更改为*ngIf
会完全删除290个额外对象 .当您仍需要初始化隐藏组件时,选择[隐藏]
检查其他情况:
Ticket.html
setNumLogs($event)
是设置numLogs
值的那个 .请注意,对于
*ngIf
,ticket-logs
组件永远不会被实例化,因此numLogs
将始终为0
. 在这种情况下,您需要使用[hidden]
,这使ticket-logs
组件有机会调用setNumLogs
来隐藏h1
及其自身 .(注意,在这种情况下,我们不能让
ticket-logs
隐藏自己的内容,因为我们仍然会显示h1
标记 . )如果希望根据条件动态插入DOM元素,则使用 ngIf . 使用hidden属性,您将始终拥有DOM元素现在,您可以随时从DOM获取它,但它(显然)不会对用户可见 .
因此,当您不希望元素完全出现在DOM中时,请使用* ngIf . 当您想要存储一些数据时(使用可见的表单元素进行发布)并且由于某种原因需要访问它时,请使用隐藏元素,使其对用户隐藏 .
ngIf 是Angular提供的指令 . 它用于在角度应用程序中添加或删除html内容 . 如果我们提供false,它将删除内容 .
例如
hidden 可以是用户只是隐藏页面中的内容 . 它不会删除DOM元素 . 但它只是隐藏
例如
我们什么时候应该使用* ngIf?
当某个表单中的某些字段应该为特定用户删除时,可以使用它 . 然后你可以使用* ngIf . 因为任何人都可以通过从dom中删除隐藏来使DOM元素可见 . 因此,如果任何人在特定条件下不应使用某个字段,则最好使用* ngIf