ответ

58

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

В режиме разработки во время второго запуска обнаружения изменений Угловой также выполняет некоторые глубокие сопоставления объектов, которые он не будет выполнять в производстве, для обнаружения изменений модели, которые запрещены.

Update:

В режиме разработки, намек также выводятся на консоль, когда HTML дезинфицирующей службы полосок из значений привязок [innerHTML]="..." или [ngStyle]="...". Смотрите также: In RC.1 some styles can't be added using binding syntax

+3

Как определить, запущен ли я в режиме производства или в режиме разработки? –

+0

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

+4

Кроме того, если вы работаете в режиме dev и открываете консоль в своем браузере, у него будет напечатанное сообщение, в котором говорится, что «Angular 2 работает в режиме разработки». Позвоните enableProdeMode(), чтобы включить режим производства.«Если вы уже находитесь в режиме производства, вы ничего здесь не увидите. –

26

Документах для ApplicationRef.tick() состояния:

В режиме разработки tick() также выполняет второй цикл обнаружения изменения (TTL = 2), чтобы гарантировать, что никаких дальнейших изменений не обнаружено. Если во время этого второго цикла будут получены дополнительные изменения, привязки в приложении будут иметь побочные эффекты, которые не могут быть разрешены в одном проходе обнаружения изменений. В этом случае Angular выдает ошибку, так как угловое приложение может иметь только один проход обнаружения изменений, в течение которого все изменения должны быть завершены.

Причина, по которой мы не можем иметь дополнительных изменений, заключается в том, что в режиме производства обнаружение изменений выполняется только один раз, что означает, что каждый компонент в дереве компонентов рассматривается один раз (TTL = 1) ... из сверху, в глубине-первом порядке. Итак, если, например, изменение входного свойства дочернего компонента вызывает изменение какого-либо другого свойства, которое родительский компонент связал в представлении/шаблоне, представление родительского компонента не будет обновляться (поскольку обнаружение изменений выиграло ' t пересмотреть родительский компонент в режиме производства ... из-за обхода дерева «один проход»). Он будет обновляться только в следующий раз, когда произойдет какое-то событие, и повторное обнаружение снова запустится - но это уже слишком поздно!

Plunker, который нарушает правило –, дочерний компонент имеет метод set для свойства ввода, которое модифицирует другое свойство ввода. Да, это надуманный пример, но его легче понять, чем следующий:

Другой сценарий, в котором вы можете столкнуться с этой проблемой, - это трубы с поддержкой состояния. Проверьте this answer, если это ваша проблема.

Вы должны описать вашу проблему (в другом вопросе SO). Должен быть способ исправить это.

Смежные вопросы