AngularJS - Почему ng-bind быстрее, чем выражения?

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

На мой взгляд, оба они завернуты в $watch(), и поэтому, когда цикл $digest() запускается, он увидит, изменилось ли значение внутри ng-bind или {{}}.

По производительности, почему ng-bind лучше, чем {{}}, как было предложено, и где ссылка?

Ответ 1

Детали, подобные этому, не всегда доступны в документации - вы должны прочитать источник. Я заглянул, и кажется, что (по состоянию на 2014-11-24) они работают одинаково. Оба инициируют создание единой директивы для изменения значения при необходимости (директива курсивной интерполяции генерируется "на лету" ).

Обе директивы оценивают выражения, участвующие в каждом $digest, как и все остальное. Основное различие заключается в том, что в то время как ng-bind не выполняет никакой дополнительной обработки по значению, с помощью завитушек весь интерполированный текст пересчитывается на каждый дайджест. По существу строка построена с использованием $interpolate и сравнивается с предыдущим значением (это происходит в недрах $digest). Ни один из способов не обновит DOM, если значение (либо простое значение с ng-bind, либо интерполированный результат с коленками) не изменилось.

Для меня принятый ответ по этому вопросу является более веской причиной для использования ng-bind, то есть вы можете использовать его для предотвращения видимой вспышки тегов шаблона до Angular загружает и компилирует их, не прибегая к хакам, таким как ng-cloak.

В зависимости от переменных могут также быть случаи, когда курчавая интерполяция на самом деле более эффективна. Одна из ситуаций, о которых я могу думать, заключается в том, что при использовании ng-bind вместо интерполяции требуется, чтобы вы создали много лишних элементов <span>, и это подсказывает весы в другом направлении. Интерполяционное выражение также вызывает создание единого наблюдателя для всей строки, независимо от того, сколько переменных вы используете, в отличие от ng-bind, который создает один наблюдатель для каждого экземпляра.

Но, как всегда, не оптимизируйте производительность раньше, и если да, то профиль, чтобы узнать, какая часть действительно имеет значение.

Ответ 2

Основное различие между ng-bind и {{}} заключается в том, что ng-bind создает наблюдателя для переменной, переданной ему (например, имя, как в приведенном выше примере), в то время как фигурные скобки ({{}}) будут (хранить целое выражение в памяти, т.е. выполнять грязную проверку и обновление выражения в каждом цикле дайджеста, даже если это не требуется. ng-bind будет применяться только тогда, когда фактически пройденное значение меняется. для получения дополнительной информации см. ссылку ниже: http://www.ufthelp.com/2015/11/difference-between-and-ng-bind-in.html