По какой-то причине мне приходится запускать свое приложение в производственном режиме. В чем разница между этими режимами?
Ответы:
В режиме разработки обнаружение изменений выполняет второй прогон сразу после первого прогона и выдает ошибку, если какое-либо связанное значение изменилось между первым и вторым прогоном. Это помогает находить ошибки, когда проверка значений имеет побочные эффекты или поля или функции не возвращают одно и то же значение при последующих вызовах, что подрывает обнаружение изменений Angular.
В режиме разработки во время второго прогона обнаружения изменений Angular также выполняет некоторые глубокие сравнения объектов, которых он не будет делать в производственной среде, чтобы обнаружить изменения модели, которые запрещены.
Обновить:
В режиме разработки подсказка также выводится на консоль, когда служба очистки HTML удаляет значения из привязок [innerHTML]="..."
или [ngStyle]="..."
. См. Также: В RC.1 некоторые стили нельзя добавить с помощью синтаксиса привязки
В документации для ApplicationRef.tick () говорится:
В режиме разработки
tick()
также выполняет второй цикл обнаружения изменений (TTL = 2), чтобы гарантировать, что дальнейшие изменения не будут обнаружены. Если во время этого второго цикла будут внесены дополнительные изменения, привязки в приложении будут иметь побочные эффекты, которые нельзя устранить за один проход обнаружения изменений. В этом случае Angular выдает ошибку, поскольку приложение Angular может иметь только один проход обнаружения изменений, во время которого должно завершиться обнаружение всех изменений.
Причина, по которой у нас не может быть дополнительных изменений, заключается в том, что в производственном режиме обнаружение изменений запускается только один раз, что означает, что каждый компонент в дереве компонентов проверяется один раз (TTL = 1) ... сверху, в глубину заказ. Таким образом, если, например, изменение входного свойства дочернего компонента вызывает изменение какого-либо другого свойства, связанного родительским компонентом в представлении / шаблоне, представление родительского компонента не будет обновлено (поскольку обнаружение изменений не будет повторно посещать родительский компонент в производственном режиме ... из-за обхода дерева "за один проход"). Он будет обновлен только в следующий раз, когда произойдет какое-либо событие и обнаружение изменений запустится снова - но это уже слишком поздно!
Вот Plunker, который нарушает правило - у дочернего компонента есть set
метод для свойства ввода, который изменяет другое свойство ввода. Да, это надуманный пример, но его легче понять, чем следующий:
Другой сценарий, в котором вы можете столкнуться с этой проблемой, - это каналы с отслеживанием состояния. Посмотрите этот ответ, если это ваша проблема.
Вы должны описать свою проблему (в другом вопросе SO). Должен быть способ исправить это.