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