Когда следует использовать * ngIf над скрытым свойством и наоборот?

Псевдокод:

 1 + max( -1, min( a.dateEnd, b.dateEnd) - max( a.dateStart, b.dateStart) )
2
задан coder 13 July 2018 в 04:55
поделиться

4 ответа

Я нашел лучший ответ в Угловом документе для вашего вопроса. Надеюсь, он предоставит вам четкий подход, чтобы узнать лучший выбор из *ngIf и hidden.

Из углового указателя

Разница между скрытием и удалением не имеет значения для простого абзаца. Неважно, когда элемент хоста привязан к ресурсоемкому компоненту. Такое поведение компонента продолжается даже тогда, когда оно скрыто. Компонент остается прикрепленным к его элементу DOM. Он продолжает слушать события. Угловое отслеживает изменения, которые могут повлиять на привязку данных. Независимо от того, что делает компонент, он продолжает делать.

Несмотря на невидимость, компонент и все его компоненты-потомки связывают ресурсы. Бремя производительности и памяти может быть существенным, отзывчивость может ухудшиться, и пользователь ничего не видит.

С положительной стороны, показывая элемент снова быстро. Предыдущее состояние компонента сохраняется и готово к отображению. Компонент не повторно инициализируется - операция, которая может быть дорогостоящей. Так что скрывать и показывать иногда нужно.

Но в отсутствие веских причин держать их в стороне, вам нужно будет удалить элементы DOM, которые пользователь не может увидеть и восстановить неиспользуемые ресурсы со структурной директивой, такой как NgIf .

Эти же соображения применимы к каждой структурной директиве, независимо от того, встроены ли они или нет. Прежде чем применять структурную директиву, вы можете временно приостановить рассмотрение последствий добавления и удаления элементов и создания и уничтожения компонентов.

5
ответ дан coder 17 August 2018 в 13:41
поделиться
  • 1
    Ничего себе, я так не думал об этом! Это мне очень помогло. Благодаря! – DongBin Kim 13 July 2018 в 04:49
  • 2
    @DongBin Ким рад помочь вам! счастливое кодирование :) – coder 13 July 2018 в 04:53
  • 3
    sidenote: если вы используете * ngIf , страница может мерцать из-за удаления элемента из DOM, тогда как [hidden] не повлияет на дизайн и положение элементов DOM. – pro.mean 13 July 2018 в 05:02
  • 4
    @coder Помимо точки зрения ресурса / памяти, как насчет проблемы, описанной в моем письме? Возможно, из-за проблемы с созданием DOM, я иногда не могу получить доступ к элементу через переменную шаблона с ошибкой Cannot read property 'nativeElement' of undefined. В этих случаях мне всегда приходилось выбирать свойство hidden. – DongBin Kim 13 July 2018 в 05:07
  • 5
    @DongBin Ким да, ваша мысль верна. как только мы изменим *ngIf на true, и тогда мы попытаемся получить доступ к элементу, в то же время у нас могут быть такие сбои. должны ждать, пока они будут готовы к использованию – coder 13 July 2018 в 05:17

* ngIf используется, когда вы хотите, чтобы элемент DOM был динамически вставлен на основе условия. С скрытым атрибутом у вас всегда будет присутствующий элемент DOM, и вы можете получить его в любое время из DOM, но он не будет видимым (очевидно) для пользователя.

Итак, используйте * ngIf, когда вы не хотите, чтобы элемент присутствовал в DOM. Используйте скрытый элемент, если хотите, чтобы некоторые данные были сохранены (для публикации возможно, возможно, с видимыми элементами формы), и ему необходимо получить к нему доступ по какой-либо причине, сохраняя его скрытым для пользователя.

0
ответ дан Code_maniac 17 August 2018 в 13:41
поделиться
  • 1
    Иногда я хотел, чтобы некоторые элементы были удалены полностью и динамически вставлены в 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.)

2
ответ дан MondKin 17 August 2018 в 13:41
поделиться
  • 1
    Спасибо за подробное объяснение. Позвольте мне задать вам одну вещь, чтобы сделать что-то ясное: скажем, есть код типа <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
  • 2
    Это может дать вам проблемы из-за #div: если вы ссылаетесь на #div, а Angular думает show = false, то #div не будет существовать. Обратите внимание, что установка this.show = true не приводит к тому, что #div не существует, вам нужно подождать, пока Angular не обработает изменения и не обновит DOM, а затем у вас будет доступ к #div. Если бы вы могли предоставить точный код (в другом вопросе, поскольку этот частично не связан), мы могли бы увидеть, как код может быть реорганизован, так как не нужно ждать, пока Angular не обновит DOM. – MondKin 13 July 2018 в 05:28
  • 3
    stackoverflow.com/questions/51318338/… Я задал вопрос по этому вопросу. Буду признателен, если вы посмотрите! – DongBin Kim 13 July 2018 в 05:45

ngIf - это директива, предоставляемая угловым. Он используется для добавления или удаления содержимого html в угловых приложениях. Если мы предоставляем false, он удалит контент.

например

<div *ngIf="isValid"> Data is valid. </div> 

скрытый пользователь может просто скрыть содержимое со страницы. Он не удаляет элементы DOM. Но он просто скрывает

, например

<div hidden> Data is valid. </div> 

. Когда мы должны использовать * ngIf?

Его можно использовать, когда некоторые поля в форме, которые необходимо удалить для конкретного пользователя. Затем вы можете использовать * ngIf. Потому что любой может сделать элемент DOM видимым, удалив скрытый из dom. Поэтому, если поле не должно использоваться кем-либо в определенном состоянии, лучше пользователю * ngIf

0
ответ дан vivekkurien 17 August 2018 в 13:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: