$ rootScopeにアクセスできません


162

次のファイルは「機能」します(エラーをスローしないという意味です)。

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script> 
    <script>
        angular.module("modx", [], function($routeProvider) {
        });
    </script>
</html>

しかしこれは

<!doctype html>
<html ng-app="modx">
    <script src="http://code.angularjs.org/angular-1.0.0rc7.js"></script>
    <script>
        angular.module("modx", [], function($routeProvider, $rootScope) {
        });
    </script>
</html>

エラーを与える:

エラー:不明なプロバイダー:modx
ソースファイルの$ rootScope :http : //code.angularjs.org/angular-1.0.0rc7.js
行:2491

WTF?


114
一番下の行としてWTFの+1。
Eliran Malka 2013

回答:


307

構成フェーズではインスタンスを要求できません-プロバイダーのみを要求できます。

var app = angular.module('modx', []);

// configure stuff
app.config(function($routeProvider, $locationProvider) {
  // you can inject any provider here
});

// run blocks
app.run(function($rootScope) {
  // you can inject any instance here
});

詳細については、http://docs.angularjs.org/guide/moduleを参照してください。


9
ありがとう、それは完全に理にかなっていますが、どうやってそれを知ったのですか?それはドキュメントにありましたか?
Malvolio、2012年

143
@Mavolioいいえ、彼は3人のコア開発者の1人です。
ChrisOdney

8
さて、FWIW、それは現在、「モジュールのロードと依存関係」セクションのドキュメントにあります。
Mark Rajcok、2012年

1
@vojtaしかし、外部からパラメータを渡してそれを使用する必要がある場合はどうなりますconfigか?asp.netアプリ内のルートパスを言う?私はグローバル変数を使用したくないだけでなくng-init='root:<%= myroot %>'root値をに使用したいのmodule.configです。
vittore 2013年

7
@vittore私は、この「外部」構成をグローバルウィンドウに配置することは問題ないと思います。または、これらすべてを定義する1つのモジュールを用意してから、アプリにロードします。angular.module('config', []).constant('appRoot', '/local/js/app');(このコードは、その後、(あなたも、htmlファイルにインライン化するというし、JSファイルとして生成することができます)サーバーによって生成されたアプリの負荷、このモジュールを、したがってへのアクセス権を持つことになる。appRoot
Vojta

7

次の「パターン」が非常に役立つことがわかりました。

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];
function MainCtrl (scope, rootscope, location, thesocket, ...) {

ここで、MainCtrlはコントローラーです。名前を変更したり、物事をつぶしたりするのではないかと恐れて、インスタンスの1対1の模倣を行うController関数のパラメーター名に依存するのは不快です。私はこの目的のために明示的に$ injectを使用することを好みます。


それは素晴らしいです。しかし、どうやってMainCtrlそのようにアクセスしますか?
f1lt3r 2016年

あなたのコメントは古いですが、将来のために質問に答える価値があります。あなたはこの方法でそれらにアクセスできるようにモジュール/コントローラには、次のように定義することができますangular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

あなたがしたように構文を使用することを勧めしません。AngularJsあなたは(希望として、異なる機能を持つことができますrunconfigservicefactory、、など。)あなたも自分でのようなことを注入する必要はありません以上professional.Inこの機能しています

MainCtrl.$inject = ['$scope', '$rootScope', '$location', 'socket', ...];

ご存知のように、それを使用することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.