无法进入$ 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
+1为WTF作为底线。
伊莱兰·马尔卡

Answers:


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位核心开发人员之一。
ChrisOdney 2012年

8
好吧,FWIW,现在在文档中的“模块加载和依赖项”部分下。
Mark Rajcok 2012年

1
@vojta但是,如果我需要从外部传递参数并将其用于内部config呢?说asp.net应用程序内的根路径?我只是不想使用全局变量,而是想使用ng-init='root:<%= myroot %>'和使用rootvalue到中module.config
vittore

7
@vittore我认为,将此“外部”配置放到全局窗口中很好。或者拥有一个定义所有这些东西的模块,然后将其加载到您的应用中-例如。angular.module('config', []).constant('appRoot', '/local/js/app');(此代码将通过你的服务器生成(你甚至可以生成它作为一个JS文件,而不是内嵌到HTML文件)。然后,您的应用程序加载这个模块,因此可以访问。appRoot
Vojta开发

7

我发现以下“模式”非常有用:

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

其中,MainCtrl是控制器。我不满意依靠Controller函数的参数名称对实例进行一对一的模拟,因为担心我可能会更改名称并弄乱东西。我更喜欢为此目的显式使用$ inject。


那很整齐; 但是您如何访问MainCtrl呢?
f1lt3r

我知道您的评论很陈旧,但是值得您回答,以备将来使用。可以这样定义模块/控制器,以便您可以通过以下方式访问它们:angular.module('myMod', []).controller('theController', controllerFunction); controllerFunction.$inject = []; function controllerFunction() { }
Mutmatt

1

不建议您像以前那样使用语法。AngularJs让你有不同的功能,只要你想(runconfigservicefactory,等。),这是更professional.In这个功能,你甚至不用来注入自己喜欢

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

如您所知,您可以使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.