$ parse、$ interpolate、$ compileサービスの違いは何ですか?


180

違いは何ですか$parse$interpolateそして$compileサービスは?私にとって、それらはすべて同じことを行います:テンプレートを受け取り、それをテンプレート関数にコンパイルします。

回答:


464

これらはすべて、AngularJSビューのレンダリングを支援するサービスの例です(ただし$parse$interpolateこのドメイン外でも使用できます)。各サービスの役割を説明するために、このHTMLの例を見てみましょう。

var imgHtml = '<img ng-src="/path/{{name}}.{{extension}}">'

スコープの値:

$scope.name = 'image';
$scope.extension = 'jpg';

このマークアップを考えると、各サービスがテーブルにもたらすものは次のとおりです。

  • $compile-マークアップ全体を取得してリンク機能に変換できます。特定のスコープに対して実行すると、HTMLテキストの一部が動的なライブDOMになり、ng-srcモデルの変更に反応するすべてのディレクティブ(ここでは)が含まれます。$ compile(imgHtml)($ scope)のように呼び出し、結果としてすべてのDOMイベント境界を持つDOM要素を取得します。$compile利用作って$interpolateその仕事をする(他のものの間に)。
  • $interpolate埋め込まれた補間式で文字列を処理する方法を知っています/path/{{name}}.{{extension}}。例:。つまり、補間式を含む文字列とスコープを取得して、結果のテキストに変換できます。この$interpolationサービスは、非常に単純な文字列ベースのテンプレート言語と考えることができます。上記の例では、次のようなサービスを使用して、結果として文字列$interpolate("/path/{{name}}.{{extension}}")($scope)を取得しpath/image.jpgます。
  • $parseは、スコープに対して$interpolate個々の式(nameextension)を評価するために使用されます。これは、指定された式の値の読み取り設定の両方に使用できます。たとえば、name式を評価する$parse('name')($scope)には、「イメージ」値を取得します。値を設定するには、次のようにします。$parse('name').assign($scope, 'image2')

これらすべてのサービスが連携して、AngularJSでライブUIを提供します。しかし、それらはさまざまなレベルで動作します。

  • $parseは個々の式のみに関係しています(nameextension)。読み書きサービスです。
  • $interpolate読み取り専用で、複数の式を含む文字列に関係しています(/path/{{name}}.{{extension}}
  • $compile AngularJS機構の中心であり、HTMLストリング(ディレクティブと補間式を含む)をライブDOMに変換できます。

11
うまく説明しました。投票しました!:)
AlwaysALearner 2013

2
いいね。それぞれの使用例と結果の例を教えてください。それは私にはまだ100%明確ではありません、そしてそれは多くの助けになると思います。ありがとう!
アレハンドロガルシアイグレシアス

2
確かに素晴らしい。ここでは、現実の利用状況のいくつかのより多くの例を見つけることができます(そして、それはよう角度を高速化についての良いシンプルの記事のウェル): スピードアップ角度-JS-と-単純な最適化 「たとえば、代わりにグローバルナビゲーションをレンダリングしますng-repeatを使用すると、$ interpolateプロバイダーを使用して独自のナビゲーションを作成し、テンプレートをオブジェクトに対してレンダリングし、それをDOMノードに変換できます。」
Nadav Lebovitch、2014

素晴らしい説明。私は実際$interpolateにAnjularJSのどこにあるかをあらゆる場所で検索しており、最終的にコンパクトで有益な答えを得ました。
Damith、2015年

例は、3つのサービスオブジェクトすべてを説明するために効果的に使用されています。初心者にとってより親しみやすいものにするために、角度のjsのさまざまな領域で、これらの種類の明確で基本的な説明がさらに必要です。
キングス

3
$interpolate-->

Let us say you have two variables assigned to $scope object in the controller,

$scope.a = 2;
$scope.b = 3;

var f = $interpolate("Result is : {{a*b}}");
var result = f($scope);
console.log(result);   --->'Result is 6'

This means that $interpolate can take the string which has one or more angular expressions.

Now $parse:

var f1 = $parse("a*b");
var result1 = f1($scope);
console.log(result1);   ----> '6'

**So $interpolate has the capability to evaluate a string with angular expressions mixed up in the string against the scope to get the result**.


Another important difference between $interpolate and $parse,$eval is:

**$interpolate has the capability to work with strings containing filters along with angular expressions.**

This feature is not accessible in $eval , $parse.

console.log($interpolate("Result is : {{a*b | currency : 'USD$'}}")($scope));

---> 'Result is USD $6.00'

$ intervalateには、$ evalと$ parseのように$ scope変数への書き込みアクセス権がありません。

$ parse、$ interpolate --->注入する必要がありますが、$ evalはコントローラーまたはそれが使用される場所に注入する必要はありません

$ parse、$ interpolateは任意のコンテキストに対して評価できる関数を提供しますが、$ evalは常に$ scopeに対して評価されます。

$ evalと$ interpolateは舞台裏で$ parseのみを使用します。


0

こちらがかわいい説明です。

var img = img/{{name}}.{{extension}}

$parse - > (name,extension) = > vimal , .jpg
$interpolate -> use angular $parse and convert into string -> img/vimal.jpg
$compile -> can turn html string img/vimal.jpg into live DOM so new img tag will be added inside our DOM with all prototype that a img tag have.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.