18

Angular.js でサービスとコントローラーを使用してモジュールを作成したとします。次のように、コントローラー内でそのサービスにアクセスできます。

var myapp = angular.module('my-app', []);

myapp.factory('Service', function() {
  var Service = {};
  Service.example = 'hello';
  //etc..
  return Service;
});

myapp.controller('mainController', function($scope, Service) {
  $scope.greeting= Service.example;
});

この例では、 Service オブジェクトがコントローラーに渡され、そのようにコードを構造化しても、コードの動作は変わりません。

myapp.controller('mainController', function(Service, $scope) {
  $scope.greeting= Service.example;
});

では、Angular.js は関数の引数の意味をどのように「認識する」のでしょうか?

4

2 に答える 2

21

AngulartoString()は依存関係の名前の関数の表現を単純に解析します。ドキュメントから:

JavaScripttoString()では、関数を呼び出すと関数定義が返されます。その後、定義を解析して、関数の引数を抽出できます。

ただし、コードが縮小されている場合、このアプローチは失敗することに注意してください。そのため、Angular は配列を使用する代替の構文 (常に使用することをお勧めします) をサポートしています。

myapp.controller('mainController', ["$scope", "Service", function($scope, Service) {
  $scope.greeting= Service.example;
}]);
于 2013-06-05T21:15:58.520 に答える
6

これは、( を使用して) 関数シグネチャ ソースで正規表現スキャンを行い、各関数引数を関数配列に繰り返しプッシュする非常に巧妙な方法( s​​ource )によって実現annotateされます。function.toString()$inject

$inject次のように配列を手動で指定すると、同じ結果が得られます。

var MyController = function($scope, myService) {
  // ...
}
// Define function dependencies
MyController.$inject = ['$scope', 'myCustomService'];
于 2013-06-05T21:17:57.493 に答える