153

ディレクティブでよく見かけるディレクティブに興味があった$scope.$evalので、ソースを調べたところ、 で次のことがわかりましたrootScope.js

  $eval: function(expr, locals) {
    return $parse(expr)(this, locals);
  },

$parseParseProviderinによって定義されてparse.jsいるように見えます。これは、独自のある種のミニ構文を定義しているように見えます (ファイルの長さは 900 行です)。

私の質問は次のとおりです。

  1. 正確には何をしているの$evalですか?なぜ独自のミニ解析言語が必要なのですか?

  2. 単純な古い JavaScript が使用されていないのはなぜevalですか?

4

3 に答える 3

187

$evalJavaScript を評価し$parseません。AngularJSを評価します。リンクされたドキュメントでは、式と JavaScript の違いについて説明しています。

Q: $eval は正確には何をしているのですか? なぜ独自のミニ解析言語が必要なのですか?

ドキュメントから:

式は、通常 {{ 式 }} などのバインディングに配置される JavaScript に似たコード スニペットです。式は $parse サービスによって処理されます。

これは JavaScript に似たミニ言語であり、実行できるものを制限し (たとえば、三項演算子を除いて制御フロー ステートメントを使用しない)、AngularJS の利点 (フィルタなど) を追加します。

Q: プレーンな古い JavaScript の「eval」が使用されないのはなぜですか?

実際には JavaScript を評価していないためです。ドキュメントが言うように:

... 任意の JavaScript コードを実行したい場合は、それをコントローラー メソッドにして、メソッドを呼び出す必要があります。JavaScript から角度式を eval() する場合は、$eval() メソッドを使用します。

上記にリンクされているドキュメントには、さらに多くの情報があります。

于 2013-03-27T23:36:09.777 に答える
22

テストから、

it('should allow passing locals to the expression', inject(function($rootScope) {
  expect($rootScope.$eval('a+1', {a: 2})).toBe(3);

  $rootScope.$eval(function(scope, locals) {
    scope.c = locals.b + 4;
  }, {b: 3});
  expect($rootScope.c).toBe(7);
}));

評価式に locals を渡すこともできます。

于 2013-12-16T15:45:02.257 に答える