宣言foo
内のどこからでも呼び出せるようにするユーティリティ関数がある場合ng-app
。モジュール設定でグローバルにアクセスできるようにする方法はありますか、それともすべてのコントローラーのスコープに追加する必要がありますか?
宣言foo
内のどこからでも呼び出せるようにするユーティリティ関数がある場合ng-app
。モジュール設定でグローバルにアクセスできるようにする方法はありますか、それともすべてのコントローラーのスコープに追加する必要がありますか?
回答:
基本的に2つのオプションがあります。サービスとして定義するか、ルートスコープに配置します。ルートスコープを汚染しないように、サービスを利用してサービスを作成することをお勧めします。次のようにして、サービスを作成し、コントローラーで利用できるようにします。
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.factory('myService', function() {
return {
foo: function() {
alert("I'm foo!");
}
};
});
myApp.controller('MainCtrl', ['$scope', 'myService', function($scope, myService) {
$scope.callFoo = function() {
myService.foo();
}
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="callFoo()">Call foo</button>
</body>
</html>
それが選択肢にならない場合は、次のようにルートスコープに追加できます。
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.run(function($rootScope) {
$rootScope.globalFoo = function() {
alert("I'm global foo!");
};
});
myApp.controller('MainCtrl', ['$scope', function($scope){
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="globalFoo()">Call global foo</button>
</body>
</html>
これにより、globalFoo()
コントローラーからテンプレートに渡す必要なく、すべてのテンプレートを呼び出すことができます。
foo()
関数がある場合はどうなりますか?$scope.callFoo()
それらすべてのラッパーを作るのは大変な作業です。ライブラリのすべての関数をスコープに「アタッチ」して、テンプレートで使用できるようにするにはどうすればよいですか?テンプレートで使用できるようにする大きな単位変換ライブラリがあります。
$scope.callFoo = myService.foo;
。使用したい場所ごとに新しいラッパーを作成する代わりに、「アタッチ」して言うことができます。
それらを組み合わせることもできます。
<!doctype html>
<html ng-app="myApp">
<head>
<script src="http://code.jquery.com/jquery-1.9.1.min.js"></script>
<script src="http://code.angularjs.org/1.1.2/angular.min.js"></script>
<script type="text/javascript">
var myApp = angular.module('myApp', []);
myApp.factory('myService', function() {
return {
foo: function() {
alert("I'm foo!");
}
};
});
myApp.run(function($rootScope, myService) {
$rootScope.appData = myService;
});
myApp.controller('MainCtrl', ['$scope', function($scope){
}]);
</script>
</head>
<body ng-controller="MainCtrl">
<button ng-click="appData.foo()">Call foo</button>
</body>
</html>
$rootScope
ますか?
最初のアプローチは「角度のような」アプローチとして提唱されていますが、これによりオーバーヘッドが増えると感じています。
このmyservice.foo関数を10の異なるコントローラーで使用するかどうかを検討します。この 'myService'依存関係を指定してから、10個すべてで$ scope.callFooスコーププロパティを指定する必要があります。これは単なる繰り返しであり、何らかの形でDRYの原則に違反しています。
一方、$ rootScopeアプローチを使用する場合は、このグローバル関数gobalFooを1回だけ指定すれば、将来のすべてのコントローラーで使用できます。
AngularJsには、「サービス」と「ファクトリー」があります。これらは、コントローラー、ディレクティブ、その他のサービス、またはその他のangularjsコンポーネント間でグローバルなものを使用するために使用されます。関数の定義、データの保存、関数の計算などを行うことができます。内側にしたいサービスとしてAngularJsコンポーネントにそれらを使用するグローバル .like
angular.module('MyModule', [...])
.service('MyService', ['$http', function($http){
return {
users: [...],
getUserFriends: function(userId){
return $http({
method: 'GET',
url: '/api/user/friends/' + userId
});
}
....
}
}])
もっと必要なら
私はAngularの方が少し新しいですが、実行するのに便利(そして非常に単純)なのは、とにかくすべてのページでアクセスする必要があるグローバル変数を使用したローカルスクリプトの前に、ページにロードするグローバルスクリプトを作成したことです。このスクリプトでは、「globalFunctions」というオブジェクトを作成し、プロパティとしてグローバルにアクセスする必要がある関数を追加しました。例えばglobalFunctions.foo = myFunc();
。次に、各ローカルスクリプトで$scope.globalFunctions = globalFunctions;
記述し、グローバルスクリプトのglobalFunctionsオブジェクトに追加した関数にすぐにアクセスできます。
これは少しの回避策であり、あなたに役立つとは思えませんが、私には多くの機能があり、すべての機能を各ページに追加するのが面倒だったので、確実に役立ちました。
module.value('myFunc', function(a){return a;});
ます。それから、名前をコントローラに挿入します。(サービスの作成を避けたい場合)