2016-09-02 2 views
17
@Pipe({name:'myPipe', pure: false}) 

Я не могу понять, нечистые трубы, некоторые из них лучше с чистыми трубами.Что такое нечистая труба в угловом?

Пожалуйста, объясните мне простой и простой пример?

+0

прочитайте [Существенное различие между чистыми и нечистыми трубами и почему это важно) (https://medium.com/@maximus.koretskyi/the-essential-difference-between-pure-and-impure-pipes-and -why-that-matters-999818aa068), который объясняет детали, лежащие в основе разницы, и исследует лежащую в основе ментальную модель. –

ответ

22

Чистая труба вызывается только тогда, когда Angular обнаруживает изменение значения или параметров, передаваемых в трубу. Нечистая труба вызывается для каждого цикла обнаружения изменений независимо от того, изменяется ли значение или параметры.

Это относится к изменениям, которые не обнаруживаемых Угловая

  • когда вы передаете массив или объект, который получил содержание изменилось (но по-прежнему тот же экземпляр)
  • когда труба вводит услугу чтобы получить доступ к другим значениям, Angular не распознает, изменились ли они.

В этих случаях вы, вероятно, все еще хотите, чтобы труба была выполнена.

Вы должны знать, что нечистые трубы подвержены неэффективности. Например, когда массив передается в канал для фильтрации, сортировки, ... тогда эта работа может выполняться каждый раз, когда выполняется запуск обнаружения изменений (что довольно часто особенно относится к настройке по умолчанию ChangeDetectionStrategy), хотя в массиве может даже не быть изменилось. Ваша труба должна попытаться распознать это и, например, вернуть результаты кэширования.

+1

Можете ли вы объяснить мне пример? –

+0

Пример, чтобы продемонстрировать, что именно? http://stackoverflow.com/a/37828164/217408 показывает канал фильтра (но не кэширование) –

+0

Чистое средство для труб, оно будет выполняться каждый раз, когда кто-то меняет вход, переданный ему. Например, '{{2 | exponent: var}}; . Теперь, когда мы меняем вход 'var', значение обновляется. Аналогичным образом, пожалуйста, обновите мое значение нечистым трубопроводом. Кто угодно??Здесь 'exponent' - моя труба –

12

Помимо предыдущего ответа, я хочу добавить еще одну разницу: количество экземпляров.

Предположим, что труба используется несколько раз в HTML-коде. Как:

<p> {{'Hello' | translate }}<p> 
<p> {{'World' | translate }}<p> 
  • Если труба чиста: там будет только один экземпляр трубы. Метод преобразования будет вызываться дважды, но в том же экземпляре.
  • Если труба нечистая: будут два экземпляра трубы.

(вы можете увидеть это путем генерации случайного идентификатора в конструктор трубы и распечатать его в обоих: constructor и transform метод)

Как чистые трубы (или вообще чистые функции) делает (должны) не имеют ЛЮБЫХ побочных эффектов, один и тот же чистый код можно повторно использовать сколько угодно раз, не беспокоясь. Похоже, именно поэтому чистые трубы только однажды создаются.

OBS: это действительно в моей угловой среде 4.0.