Псевдокод:
1 + max( -1, min( a.dateEnd, b.dateEnd) - max( a.dateStart, b.dateStart) )
Я нашел лучший ответ в Угловом документе для вашего вопроса. Надеюсь, он предоставит вам четкий подход, чтобы узнать лучший выбор из *ngIf
и hidden
.
Разница между скрытием и удалением не имеет значения для простого абзаца. Неважно, когда элемент хоста привязан к ресурсоемкому компоненту. Такое поведение компонента продолжается даже тогда, когда оно скрыто. Компонент остается прикрепленным к его элементу DOM. Он продолжает слушать события. Угловое отслеживает изменения, которые могут повлиять на привязку данных. Независимо от того, что делает компонент, он продолжает делать.
Несмотря на невидимость, компонент и все его компоненты-потомки связывают ресурсы. Бремя производительности и памяти может быть существенным, отзывчивость может ухудшиться, и пользователь ничего не видит.
С положительной стороны, показывая элемент снова быстро. Предыдущее состояние компонента сохраняется и готово к отображению. Компонент не повторно инициализируется - операция, которая может быть дорогостоящей. Так что скрывать и показывать иногда нужно.
Но в отсутствие веских причин держать их в стороне, вам нужно будет удалить элементы DOM, которые пользователь не может увидеть и восстановить неиспользуемые ресурсы со структурной директивой, такой как
NgIf
.Эти же соображения применимы к каждой структурной директиве, независимо от того, встроены ли они или нет. Прежде чем применять структурную директиву, вы можете временно приостановить рассмотрение последствий добавления и удаления элементов и создания и уничтожения компонентов.
blockquote>
* ngIf используется, когда вы хотите, чтобы элемент DOM был динамически вставлен на основе условия. С скрытым атрибутом у вас всегда будет присутствующий элемент DOM, и вы можете получить его в любое время из DOM, но он не будет видимым (очевидно) для пользователя.
Итак, используйте * ngIf, когда вы не хотите, чтобы элемент присутствовал в DOM. Используйте скрытый элемент, если хотите, чтобы некоторые данные были сохранены (для публикации возможно, возможно, с видимыми элементами формы), и ему необходимо получить к нему доступ по какой-либо причине, сохраняя его скрытым для пользователя.
*ngIf
, но, как я описал в своем письме, из-за проблемы цикла / времени я не смог получить доступ к элементу в *ngIf
с переменными шаблона даже после изменения условия на true
, поэтому я просто выбрал свойство hidden
.
– DongBin Kim
13 July 2018 в 04:46
Было два случая, когда у меня были причины выбирать один из них:
*ngIf
, когда использование [hidden]
вызовет проблему с производительностью (сотни скрытых тегов все еще находятся в DOM и могут вызывать вялое рендеринг вашего сайта). [hidden]
, когда вам еще нужно инициализировать скрытый компонент и передать ему события, даже если вы не собираетесь показывать это Помимо этих 2 правил, это вопрос того, что чувствует себя правильно для вашей установки.
Я даю вам пример каждого из тех, что я нашел в реальной жизни :
*ngIf
, когда использование [hidden]
вызовет проблему с производительностью Представьте, что у вас есть объект Ticket
, и вы отслеживаете изменение каждого билета с помощью списка объектов Log
. Каждый журнал представляет собой тип изменений, которые нужно визуализировать по-разному (например: закрытие билета создает журнал, который показывает старое и новое состояние, но добавление файла в билет показывает предварительный просмотр файла).
Одна возможная реализация использует [hidden]
следующим образом:
<span [hidden]="logType !== 1">...</span>
<span [hidden]="logType !== 2">...</span>
<span [hidden]="logType !== 3">...</span>
...
<span [hidden]="logType !== 30">...</span>
Затем для каждого журнала на вашей странице вы будете иметь 29 скрытых элементов DOM. Теперь, если ваш билет сильно изменится, скажите 10 модификаций, вы получите 290 скрытых элементов в вашей DOM, которые будут использовать память и будут медленнее отображать.
В этом случае изменение [hidden]
до *ngIf
полностью удаляет 290 дополнительных объектов.
[hidden]
, когда вам еще нужно инициализировать скрытый компонент Проверьте эту другую ситуацию:
Ticket.html
<ng-container *ngIf="numLogs > 0">
<h1>Logs</h1>
<ticket-logs [ticketId]="ticket.id"
(onNumLogsRetrieved)="setNumLogs($event)"></ticket-logs>
</ng-container>
Где setNumLogs($event)
- тот, который устанавливает значение numLogs
.
Обратите внимание, что с *ngIf
ticket-logs
компонент никогда не будет создан, поэтому numLogs
всегда будет 0
. В этом случае вам нужно использовать [hidden]
, который дает компоненту ticket-logs
возможность вызвать setNumLogs
, чтобы скрыть h1
и себя.
(Обратите внимание, что в этом случае мы не можем ticket-logs
скрыть свое собственное содержимое, потому что мы все равно будем показывать тег h1
.)
<ng-container *ngIf="show"><div #div></div></ng-container>
. В какой-то момент я хочу получить доступ к элементу div
, чтобы попытаться: this.show = true; // do Something with this.div.nativeElement
И проблема в том, что ошибка испускается, говоря Cannot read property 'nativeElement' of undefined.
. Это ожидаемое поведение? Я спрашиваю об этом, поскольку, насколько мне известно, я должен иметь доступ к нему, потому что я установил переменную show
в true
.
– DongBin Kim
13 July 2018 в 05:20
#div
: если вы ссылаетесь на #div
, а Angular думает i> show = false
, то #div
не будет существовать. Обратите внимание, что установка this.show = true
не приводит к тому, что #div
не существует, вам нужно подождать, пока Angular не обработает изменения и не обновит DOM, а затем у вас будет доступ к #div
. Если бы вы могли предоставить точный код (в другом вопросе, поскольку этот частично не связан), мы могли бы увидеть, как код может быть реорганизован, так как не нужно ждать, пока Angular не обновит DOM.
– MondKin
13 July 2018 в 05:28
ngIf - это директива, предоставляемая угловым. Он используется для добавления или удаления содержимого html в угловых приложениях. Если мы предоставляем false, он удалит контент.
например
<div *ngIf="isValid"> Data is valid. </div>
скрытый пользователь может просто скрыть содержимое со страницы. Он не удаляет элементы DOM. Но он просто скрывает
, например
<div hidden> Data is valid. </div>
. Когда мы должны использовать * ngIf?
Его можно использовать, когда некоторые поля в форме, которые необходимо удалить для конкретного пользователя. Затем вы можете использовать * ngIf. Потому что любой может сделать элемент DOM видимым, удалив скрытый из dom. Поэтому, если поле не должно использоваться кем-либо в определенном состоянии, лучше пользователю * ngIf
Cannot read property 'nativeElement' of undefined
. В этих случаях мне всегда приходилось выбирать свойствоhidden
. – DongBin Kim 13 July 2018 в 05:07*ngIf
наtrue
, и тогда мы попытаемся получить доступ к элементу, в то же время у нас могут быть такие сбои. должны ждать, пока они будут готовы к использованию – coder 13 July 2018 в 05:17