AngularJS: Чому ng-bind краще, ніж {{}} в кутовому?


401

Я був в одному з кутових презентацій, і одна з осіб у згадуваній зустрічі ng-bind- це краще, ніж {{}}обов'язковість.

Одна з причин: ng-bindпомістіть змінну в список спостереження, і лише тоді, коли є зміна моделі, дані будуть натиснуті на перегляд, з іншого боку, {{}}кожен раз буде інтерполювати вираз (я думаю, це кутовий цикл) і натиснути значення, навіть якщо значення змінилося чи ні.

Крім того, сказано, що якщо у вас не так багато даних на екрані, ви можете використовувати, {{}}і питання про продуктивність не буде видно. Чи може хтось пролити трохи світла на це питання для мене?



3
Чи можете ви, будь ласка, перевірити, чи моя відповідь краща
Костянтин Крас

{{}} На мій погляд, це не практично, глядач побачить ваш тег до повного завантаження даних. Цікаво, чи коли-небудь команда Angular збирається вирішити це питання.
Джеррі Лян

2
@Blazemonger: Ви не можете просто включити атрибут ng-cloak, щоб запобігти тимчасовому відображенню шаблонів?
супершнє

Відповіді:


322

Якщо ви не використовуєте ng-bind, натомість щось подібне:

<div>
  Hello, {{user.name}}
</div>

ви можете побачити фактичне Hello, {{user.name}}за секунду до того, як user.nameбуде вирішено (до завантаження даних)

Ви могли б зробити щось подібне

<div>
  Hello, <span ng-bind="user.name"></span>
</div>

якщо це питання для вас.

Ще одне рішення - використовувати ng-cloak.


3
Виходячи з того, що ви говорите, немає результатів, якщо ми використовуємо {{}}? Мені сказали, якщо ви будете використовувати {{}} щоразу, це стане інертним та генерує результат, навіть якщо модель не зміниться.
Nair

4
І як використовувати ng-bind, якщо я не хочу загортати user.name всередині тегу span? Якщо я використовую фігурні дужки, я отримаю чисту назву, без html-тегів
Віктор

5
@KevinMeredith виглядає так, коли HTML завантажився, але угловий ще (ще). Пам'ятайте, що про шаблони на стороні клієнта ми говоримо. Вся інтерполяція повинна бути виконана в браузері, що завантажує додаток. Зазвичай кутові навантаження досить швидко, щоб це не було помітно, але в деяких випадках це стає проблемою. Отже, ng-cloakбула винайдена, щоб виправити цю проблему.
голографічний принцип

17
для мене це не відповідь на питання, чому ngBind краще. Це просто як використовувати ngBind замість анотації {{}} та посилання на ngCloak.
Костянтин Крас

4
@Victor також ng-bind-templateможна поєднати обидва підходи: ng-bind-template="Hello, {{user.name}}"тут прив'язка все ще пропонує підвищення продуктивності та не вводить подальших
вкладень

543

Видимість:

Поки ваш angularjs завантажується, користувач може побачити розміщені дужки в HTML. З цим можна впоратися ng-cloak. Але для мене це обхідне рішення, яке мені не потрібно використовувати, якщо я його використовую ng-bind.


Продуктивність:

{{}}Це набагато повільніше .

Це ng-bindє директива і помістити спостерігача на пройдений змінної. Тож ng-bindзастосовуватиметься лише тоді, коли передане значення дійсно зміниться .

Кронштейни з іншого боку будуть брудно перевірені та оновлені у кожному $digest , навіть якщо це не потрібно .


Зараз я будую велику програму для однієї сторінки (~ 500 прив’язок за перегляд). Перехід від {{}} до строгого ng-bindврятував нас приблизно на 20% scope.$digest.


Пропозиція :

Якщо ви використовуєте модуль перекладу, такий як angular-translate , завжди віддайте перевагу директивам перед анотацією дужок.

{{'WELCOME'|translate}} => <span ng-translate="WELCOME"></span>

Якщо вам потрібна функція фільтра, краще знайдіть директиву, яка фактично просто використовує ваш власний фільтр. Документація для послуги фільтра $


ОНОВЛЕННЯ 28.11.2014 (але може бути поза темою):

У Angular 1.3x bindonceбула представлена ​​функціональність. Тому ви можете зв'язати значення виразу / атрибуту один раз (буде прив’язано, коли! = 'Undefined').

Це корисно, коли ви не очікуєте, що ваша прив'язка зміниться.

Використання: Місце ::перед прив’язкою:

<ul>  
  <li ng-repeat="item in ::items">{{item}}</li>
</ul>  
<a-directive name="::item">
<span data-ng-bind="::value"></span>

Приклад:

ng-repeatдля виведення деяких даних у таблицю з декількома прив'язками на рядок. Переклади, прив'язки до фільтрів, які виконуються у кожному дайджесті області.


32
це краща відповідь
NimChimpsky

13
З того, що я можу сказати з джерела (станом на 2014-11-24), фігурна інтерполяція обробляється так само, як і директива (див. AddTextInterpolateDirective () в ng / compile.js). Він також використовує $ watch, тому DOM не торкається, якщо текст не змінюється, він не "брудно перевіряє та оновлює" його на кожному дайджесті $, як ви заявляєте. Однак, що робиться на кожному дайджесті $, це те, що обчислюється інтерпольована рядок результатів. Він просто не призначений текстовому вузлу, якщо він не зміниться.
Матті Вірккунен

6
Я написав тест ефективності для внутрішнього оцінювання. Він мав 2000 записів у ng повторенні та відображав 2 атрибути в об'єкті, тому прив'язки 2000x2. Прив'язки відрізняються між собою: Першим зв'язуванням було лише зв'язування в проміжку. Секунди мали прив’язку та деякий простий html у ній. Результат: ng-bind було швидше, застосував приблизно 20% за область застосування. Не перевіряючи код, здається, що додатковий звичайний html з фігурним виразом в html-елементі займає ще більше часу.
Костянтин Красс

2
Просто хочу зазначити, що згідно з тестами тут: jsperf.com/angular-bind-vs-brackets, схоже, показує, що дужки швидші, ніж зв’язувати. (Примітка: бруски є оп в секунду, тим краще довше). І як зазначають попередні коментарі, механізми їх спостереження остаточно ідентичні.
Воррен

1
Оскільки ви не надаєте жодного джерела, я даю вам одне: ng-perf.com/2014/10/30/… "ng-прив'язування швидше, оскільки воно простіше. Інтерполяція повинна пройти додаткові кроки перевірки контексту, jsonification значення та інше. Це робить його трохи повільніше ".
Костянтин Крас

29

ng-bind краще, ніж {{...}}

Наприклад, ви можете:

<div>
  Hello, {{variable}}
</div>

Це означає, що весь текст, що Hello, {{variable}}додається, <div>буде скопійований та збережений у пам'яті.

Якщо замість цього ви робите щось подібне:

<div>
  Hello, <span ng-bind="variable"></span>
</div>

У пам'яті зберігатиметься лише значення цього значення, а кутове буде реєструвати спостерігач (вираз watch), який складається лише з змінної.


7
З іншого боку, ваш DOM знаходиться глибше. Залежно від того, що ви робите, у великих документах це може вплинути на ефективність візуалізації.
stephband

2
Так, я думаю, що так само і @stephband. Якщо ви просто хочете, наприклад, відобразити ім'я та прізвище. Чому б не просто інтерполяцію? Він буде виконувати так само, тому що він буде працювати однакові годинники в 1 дайджесті. Як: <div> {{firstName}} {{lastName}} </div> == <div> <span ng-bind = "firstName"> </span> <span ng-bind = "lastName"> </ span> </div> .. І перший виглядає краще. Я думаю, що це багато що залежить від того, що ти хочеш, але зрештою, вони мають і переваги, і недоліки.
pgarciacamou

3
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div>є альтернативою {{}} та таким функціям, як ng-bind
northamerican

1
Це не яблука, а яблука - ви вводите прольотний елемент в одне, а не в інше. Приклад з ng-bindбув би порівняннішим із <div>Hello, <span>{{variable}}</span></div>.
іконоборство

15

В основному подвійний фігурний синтаксис є більш природним для читання і вимагає меншої кількості тексту.

Обидва випадки дають однаковий вихід, але .. якщо ви вирішите перейти, {{}}є ймовірність, що користувач побачить протягом декількох мілісекунд, {{}}перш ніж ваш шаблон буде представлений кутовим. Тож якщо ви помітили будь-яке, {{}}тоді краще скористатися ng-bind.

Також дуже важливо те, що лише у index.html вашого кутового додатка ви можете скасувати показ {{}}. Якщо ви використовуєте директиви, тож шаблони, немає шансу побачити це через те, що кутовий спочатку надає шаблон і після додає його до DOM.


5
Цікаво, що це не те саме. Я не отримую виводу на ng-bind = "anArrayViaFactory" проти {{anArrayViaFactory}}. Я зіткнувся з цією проблемою, намагаючись вивести відповідь json у прототипі jekyll, але через конфлікт із подібними шаблонами {{}} я змушений був використовувати ng-bind. Ng-прив'язка всередині ng-повторного блоку (елемент у anArrayViaFactory) виведе значення.
eddywashere

5

{{...}}Мається на увазі двостороннє зв'язування даних. Але, ng-bind насправді призначений для одностороннього прив'язки даних.

Використання ng-bind зменшить кількість спостерігачів на вашій сторінці. Отже, зв'язування ng буде швидше, ніж {{...}}. Отже, якщо ви хочете відобразити лише значення та його оновлення, і не хочете відображати його зміну від інтерфейсу користувача назад до контролера, тоді перейдіть до ng-bind . Це збільшить продуктивність сторінки та скоротить час завантаження сторінки.

<div>
  Hello, <span ng-bind="variable"></span>
</div>

4

Це пояснюється тим, що за {{}}допомогою кутового компілятора враховується і текстовий вузол, і його батьківський, оскільки існує можливість об'єднання 2-х {{}}вузлів. Отже, існують додаткові лінкери, які додають час завантаження. Звичайно, для кількох таких випадків різниця несуттєва, однак, коли ви використовуєте це всередині ретранслятора великої кількості елементів, це спричинить вплив на більш повільне середовище виконання.


2

введіть тут опис зображення

Причина, чому Ng-Bind краще, тому що,

Якщо Ваша сторінка не завантажена або коли ваш Інтернет повільний або коли веб-сайт завантажений наполовину, ви можете побачити такі проблеми (Перевірте знімок екрана з позначкою Прочитання), що буде викликано на екрані, який цілком дивний. Щоб цього не сталося, ми повинні використовувати Ng-bind


1

У ng-bind також є свої проблеми. Коли ви намагаєтесь використовувати кутові фільтри , ліміт чи щось інше, у вас може виникнути проблеми, якщо ви використовуєте ng-bind . Але в іншому випадку ng-bind краще на стороні UX. Коли користувач відкриє сторінку, він / вона побачить (10ms-100ms), що друкують символи ( {{...}} ), тому ng-bind краще .


1

У {{}} є певна проблема мерехтіння, наприклад, коли ви оновлюєте сторінку, то для короткого спаму часу вираз виражається. Отже, ми повинні використовувати ng-bind замість виразу для відображення даних.


0

ng-bindє також більш безпечним, оскільки він представляє htmlсобою рядок.

Так, наприклад, '<script on*=maliciousCode()></script>'відображатиметься як рядок і не буде виконуватися.


0

За даними Angular Doc:
Оскільки ngBind є атрибутом елемента, він робить прив’язки невидимими для користувача під час завантаження сторінки ... це головна відмінність ...

В основному, поки не завантажуються всі елементи dom , ми не можемо їх побачити, і тому що ngBind є атрибутом елемента, він чекає, поки вступляються в дім ... більше інформації нижче

ngBind
- директива в модулі ng

Атрибут ngBind вказує AngularJS замінити текстовий вміст зазначеного елемента HTML на значення заданого виразу та оновити текстовий вміст, коли значення цього виразу зміниться.

Зазвичай ви не використовуєте ngBind безпосередньо , а замість цього використовуєте подвійну фігурну розмітку, наприклад {{вираз}}, яка схожа, але менш багатослівна.

Бажано використовувати ngBind замість {{express}}, якщо шаблон миттєво відображається браузером у своєму сирому стані до того, як AngularJS скомпілює його. Оскільки ngBind є атрибутом елемента, він робить прив’язки невидимими для користувача під час завантаження сторінки.

Альтернативне рішення цієї проблеми буде використання ngCloak директиви. завітайте сюди

для отримання додаткової інформації про ngbind відвідайте цю сторінку: https://docs.angularjs.org/api/ng/directive/ngBind

Ви можете зробити щось подібне як атрибут, ng-bind :

<div ng-bind="my.name"></div>

або робити інтерполяцію, як показано нижче:

<div>{{my.name}}</div>

або таким чином з атрибутами ng-cloak в AngularJs:

<div id="my-name" ng-cloak>{{my.name}}</div>

ng-плащ уникайте спалаху на домі і чекайте, поки всі будуть готові! це дорівнює атрибуту ng-bind ...


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.