AngularJS:AngularJSでは、ng-bindが{{}}より優れているのはなぜですか?


401

私は角張ったプレゼンテーションの1つにいて、言及された会議の1人は拘束力ng-bindより優れてい{{}}ます。

理由の1つは、ng-bind変数をウォッチリストに配置し、モデルの変更がある場合にのみ、データがプッシュされて表示される一方で、{{}}毎回式を補間して(角度サイクルだと思います)、値が変更されたかどうかにかかわらず、値。

また、画面上にデータがあまりない場合でも使用でき{{}}、パフォーマンスの問題が見えなくなるとも言われています。誰かがこの問題についていくつかの光を当てることができますか?



3
私の答えの方が良いかどうか確認してください
Konstantin Krass

私の考えでは{{}}は実用的ではありません。データが完全に読み込まれる前に、ビューアがタグを表示します。Angularチームはこの問題を修正するつもりなのでしょうか。
Jerry Liang

2
@Blazemonger:テンプレートが一時的に表示されないように、ng-cloak属性を含めることはできませんか?
supershnee

回答:


322

を使用していない場合はng-bind、代わりに次のようにします。

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

解決される前(データがロードされるHello, {{user.name}}user.name)の1秒間の実際が表示される場合があります。

あなたはこのようなことをすることができます

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

それがあなたにとって問題であるなら。

別の解決策はを使用することng-cloakです。


3
あなたが言っていることに基づいて、{{}}を使用してもパフォーマンスに影響はありませんか?モデルを変更しなくても、{{}}を使用すると、常に補間されて結果が生成されると言われました。
Nair

4
そして、スパンタグ内にuser.nameをラップしたくない場合は、ng-bindをどのように使用しますか?中かっこを使用すると、htmlタグなしでクリーンな名前が得られます
Victor

5
@KevinMeredithは、HTMLが読み込まれたときにそのように見えますが、(まだ)角度は読み込まれていません。それは私たちが話しているクライアント側のテンプレートであることを忘れないでください。すべての補間は、アプリをロードするブラウザーで行う必要があります。通常、角荷重は目立たないほど高速ですが、場合によっては問題になります。したがって、ng-cloakこの問題を修正するために発明されました。
ホログラフィック原理

17
私にとって、これはngBindの方が優れている理由の質問に対する答えではありません。これは、{{}}アノテーションの代わりにngBindを使用する方法とngCloakへの参照です。
Konstantin Krass 2014

4
@Victorもありますng-bind-template:あなたは両方が近づいて組み合わせることができますどこng-bind-template="Hello, {{user.name}}"ここで結合は、まだパフォーマンスの向上を提供し、それ以上のネストを導入しない
loother

543

可視性:

angularjsがブートストラップしている間、ユーザーはhtmlに配置されたブラケットを見るかもしれません。これはで処理できますng-cloak。しかし、私にとってこれは回避策であり、を使用する場合、使用する必要はありませんng-bind


パフォーマンス:

{{}}あるはるかに遅いです

これng-bindディレクティブであり、渡された変数にウォッチャーを配置します。そのためng-bind渡された値が実際に変更された場合にのみ適用されます。

一方、ブラケットは、必要ない場合でも、ダーティチェックされ、毎回 更新されます$digest


私は現在、大きな単一ページアプリ(ビューあたり500バインディング)を構築しています。{{}}からstrictに変更するとng-bind、すべてので約20%節約できましたscope.$digest


提案

angular-translateなどの変換モジュールを使用する場合は、ブラケットアノテーションの前に常にディレクティブを使用してください。

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

フィルター関数が必要な場合は、実際にはカスタムフィルターを使用するだけのディレクティブをお勧めします。 $ filterサービスのドキュメント


更新28.11.2014(ただし、トピックから外れている可能性があります):

Angular 1.3xでは、このbindonce機能が導入されました。したがって、式/属性の値を1回バインドできます(!= '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 2014年

13
ソースからわかること(2014年11月24日現在)から、カーリー補間はディレクティブのように処理されます(ng / compile.jsのaddTextInterpolateDirective()を参照)。また、$ watchを使用しているため、テキストが変更されない場合でもDOMは変更されず、$ digestごとに「ダーティチェックおよび更新」されません。すべての$ digestで行われるのは、補間された結果文字列が計算されることです。変更しない限り、テキストノードには割り当てられません。
Matti Virkkunen、2014年

6
内部評価用のパフォーマンステストを作成しました。NGリピートに2000のエントリがあり、オブジェクトに2つの属性が表示されたため、2000x2のバインディングです。バインディングは異なります。最初のバインディングは、スパン内のバインディングのみでした。秒にはバインディングとプレーンHTMLが含まれていました。結果:ng-bindは、適用されるスコープごとに約20%高速でした。コードをチェックしないと、html要素にcurly式を含むプレーンHTMLを追加するとさらに時間がかかるようです。
Konstantin Krass 2014年

2
jsperf.com/angular-bind-vs-bracketsのテストによると、ブラケットがバインドよりも高速であることを示しているようです。(注:バーは1秒あたりの操作数であるため、長いほど優れています)。そして、以前のコメントが指摘しているように、彼らの監視メカニズムは最終的に同一です。
ウォーレン

1
ソースを提供していないので、私はあなたに提供します:ng-perf.com/2014/10/30/… "ng-bindは、シンプルであるため高速です。補間は、コンテキストを検証する追加の手順を実行する必要があります値以上。そのため、少し遅くなります。」
コンスタンティンクラス

29

ng-bind よりも良い {{...}}

たとえば、次のようにできます。

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

つまり、でHello, {{variable}}囲まれたテキスト全体<div>がコピーされ、メモリに保存されます。

代わりに次のようなことをすると:

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

値の値のみがメモリに保存され、angularは変数のみで構成されるウォッチャー(ウォッチ式)を登録します。


7
一方、DOMはより深いです。何をしているのかに応じて、大きなドキュメントでは、レンダリングのパフォーマンスに影響を与える可能性があります。
stephband 2014

2
ええ、@ stephbandと同じように思います。たとえば、名前と姓だけを表示したい場合。なぜ補間だけではないのですか?同じウォッチを1つのダイジェストで実行するため、同じように実行されます。例:<div> {{firstName}} {{lastName}} </ div> == <div> <span ng-bind = "firstName"> </ span> <span ng-bind = "lastName"> </ span> </ div> ..そして、最初のものはより良く見えます。それはあなたが何を望んでいるかに大きく依存すると思いますが、結局のところ、どちらにも長所と短所があります。
pgarciacamou 2014年

3
<div ng-bind-template="{{ var1 }}, {{ var2}}"></div>{{}}に代わるものであり、ng-bindのような関数
北アメリカ

1
これはリンゴ同士ではなく、スパン要素を一方に導入するだけで、もう一方には導入しません。を使用した例ng-bindは、にさらに似てい<div>Hello, <span>{{variable}}</span></div>ます。
iconoclast

15

基本的に、ダブルカーリー構文はより自然に読みやすく、入力の手間が少なくなります。

どちらの場合も同じ出力が生成されますが、これを選択した場合、テンプレートが角度でレンダリングされる前に、{{}}数ミリ秒間ユーザーに表示される可能性があります{{}}。そのため、何かに気づいたら{{}}、使用する方が良いでしょうng-bind

また、非常に重要なのは、レンダリングされていないを使用できるのは、角度アプリのindex.htmlでのみであることです{{}}。ディレクティブを使用してテンプレートを使用している場合は、angularが最初にテンプレートをレンダリングし、それをDOMに追加するため、それが表示される可能性はありません。


5
興味深いことに、それは同じではありません。ng-bind = "anArrayViaFactory"と{{anArrayViaFactory}}の出力がありません。jekyllプロトタイプでjson応答を出力しようとしたときにこの問題に遭遇しましたが、同様のテンプレート{{}}との競合のため、ng-bindを使用せざるを得ませんでした。ng-repeatブロック内のng-bind(anArrayViaFactoryのアイテム)は値を出力します。
eddywashere、2014年

5

{{...}}双方向のデータバインディングを意味します。ただし、ng-bindは実際には一方向のデータバインディング用です。

ng-bindを使用すると、ページ内のウォッチャーの数が減ります。したがって、ng-bindはよりも高速になり{{...}}ます。したがって、値とその更新を表示するだけで、UIからコントローラーへの変更を反映したくない場合は、ng-bindを使用します。これにより、ページのパフォーマンスが向上し、ページの読み込み時間が短縮されます。

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

4

これは{{}}、2つの{{}}ノードがマージされる可能性があるため、角度コンパイラーはテキストノードとその親の両方を考慮するためです。したがって、ロード時間を増やす追加のリンカーがあります。もちろん、そのようないくつかの発生については違いは重要ではありませんが、多数のアイテムのリピーター内でこれを使用すると、より遅いランタイム環境に影響を及ぼします。


2

ここに画像の説明を入力してください

Ng-Bindが優れている理由は、

ページが読み込まれていない場合、インターネットが遅い場合、またはウェブサイトが半分読み込まれている場合、これらのタイプの問題(スクリーンショットと読み取りマークを確認)が完全に奇妙な画面でトリガーされることがわかります。そのようなことを避けるために、NGバインドを使用する必要があります


1

ng-bindにも問題があります。角度フィルター制限などを使用しようとすると、ng-bindを使用すると問題が発生する可能性があります。しかし、それ以外の場合、UXサイドではng-bindの方が優れています。ユーザーがページを開くと、シンボル({{...}})を印刷する(10ms-100ms)が表示されるため、ng-bindの方が優れています。 。


1

{{}}にちらつきの問題があり、ページを更新すると、短い時間のスパムが表示されます。したがって、データの表現には、式の代わりにng-bindを使用する必要があります。


0

ng-bindhtml文字列として表されるため、安全です。

したがって、たとえば、'<script on*=maliciousCode()></script>'文字列として表示され、実行されません。


0

アンギュラドキュメントによると:
のでngBindは、要素の属性があり、それはページの読み込み中にユーザーへのバインディングは見えなくなります...それが主な違いです...

基本的に、すべてのdom要素が読み込まれなくなるまで、それらを見ることができません。ngBindは要素の属性であるため、domが動作するまで待機します... 以下の詳細

ngBind-
モジュールng

ディレクティブngBind属性は、AngularJSに指定されたHTML要素のテキストコンテンツを特定の式の値で置き換え、その式の値が変更されたときにテキストコンテンツを更新するように指示します

通常、直接ngBindを使用するのではなく、代わりに{{expression}}のような二重のカーリーマークアップを使用します。

AngularJSがテンプレートをコンパイルする前にテンプレートが未加工の状態でブラウザーによって一時的に表示される場合は、{{expression}}ではなくngBindを使用することをお勧めします。ngBindは要素の属性であるため、ページの読み込み中はユーザーにバインディングを非表示にします。

この問題の代替ソリューションは、ngCloakディレクティブを使用することです。こちらをご覧ください

ngbindの詳細については、次のページにアクセスしてください。https//docs.angularjs.org/api/ng/directive/ngBind

あなたは属性としてng-bindとしてこのようなことをすることができます:

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

または以下のように補間を行います:

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

またはこのようにAngularJsのng-cloak属性で:

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

ng-cloakは、domのフラッシュを避け、すべての準備ができるまで待ちます!これはng-bind属性と同じです...


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.