1

カスタム コントローラーが "new" キーワードでインスタンス化されるか、単に $scope オブジェクトに適用されるかについて、矛盾する情報を見てきました。

ドキュメントサイトによると、

Angular は (JavaScript の Function#apply の意味で) コントローラー コンストラクター関数を新しい Angular スコープ オブジェクトに適用し、初期スコープ状態を設定します。これは、Angular がコントローラ タイプのインスタンスを作成しないことを意味します (コントローラ コンストラクタで new オペレータを呼び出すことにより)。コンストラクターは、常に既存のスコープ オブジェクトに適用されます。

しかし、Angular 1.2 のように見え"as"ますが、次のようにコントローラーの名前を別の名前に変更するコンストラクトがあります。

<body ng-controller="DemoController as demo">
    <tr ng-repeat="student in demo.students">
        <td>{{student.name}}</td>
    </tr>
</body>

function DemoController() {
    this.students = [...]
}

newしたがって、これは、コントローラーがキーワードを使用してインスタンス化されているように見えます。

どちらですか?誰かがこれを明確にできますか?

4

1 に答える 1

1

「as」構文は単なるエイリアスであり、Angular がコントローラー コンストラクターで new 演算子を呼び出すことによってコントローラー型のインスタンスを作成しないというドキュメントは正しいです。エイリアシングによる新しい動作$ControllerProviderは、キーワードの存在について正規表現テストを実行し、存在するas場合はエイリアス名でローカル スコープにコントローラーへの参照を格納するというものです。

これは、関連するコードを変更した git 機能のコミットへのリンクです。


また$ControllerProvider:Angularソース(1.1.5)から、コントローラーを作成するコードは次のとおりです。

instance = $injector.instantiate(expression, locals);

そしてここにinstantiate方法があります:

function instantiate(Type, locals) {
  var Constructor = function() {},
      instance, returnedValue;

  // Check if Type is annotated and use just the given function at n-1 as parameter
  // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
  Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
  instance = new Constructor();
  returnedValue = invoke(Type, instance, locals);

  return isObject(returnedValue) ? returnedValue : instance;
}

newしたがって、キーワード実際に呼び出されていることがわかりますがConstructor、コントローラー コンストラクターではなく、 という空のジェネリック関数で呼び出されています。まず、空のコンストラクターのプロトタイプがType、インジェクターに渡される Angular のプロトタイプに設定されます。

于 2013-06-12T04:11:36.197 に答える