我有这块布局html:
<body ng-controller="MainController"> <div id="terminal"></div> <div ng-view></div> <!-- including scripts --> </body>
现在显然,当我尝试在MainController中使用$ routeParams时,它总是空的。重要的是要注意,MainController应该在每个可能的路由中生效;因此我没有在我的app.js中定义它。我的意思是我没有在这里定义:
$routeProvider.when("/view1",{ templateUrl: "partials/partial1.html" controller: "MyCtrl1" }) $routeProvider.when("/view2",{ templateUrl: "partials/partial2.html" controller: "MyCtrl2" }) // I'm not defining MainController here!!
其实我觉得我的问题和这个完全一样:https://groups.google.com/forum/#!topic/angular/ib2wHQozeNE
但是,我仍然不知道如何在主控制器中获取路由参数…
编辑:
我的意思是,我没有将MainController与任何特定的路由相关联。它被定义它是所有其他控制器的父控制器。我想知道的是,当你去一个像/任何一个URL这样的路由,如/:无论什么,为什么只有子控制器才能访问路由参数,而主要控制器不是?我如何得到:我的主控制器中的任何路由参数?
$ routeParams服务异步填充。这意味着在控制器中首次使用时通常会显示为空。
要在$ routeParams已填充时通知,请订阅$ scope上的$ routeChangeSuccess事件。 (如果您处于无法访问子级别$ scope的组件,例如,服务或工厂,则可以注入并使用$ rootScope。)
module.controller('FooCtrl',function($scope,$routeParams) { $scope.$on('$routeChangeSuccess',function() { // $routeParams should be populated here }); );
路由使用的控制器或路由中包含的模板中的控制器将立即访问完全填充的$ routeParams,因为ng-view等待$ routeChangeSuccess事件继续。 (它必须等待,因为它需要路由信息才能决定哪个模板/控制器甚至加载。)
如果您知道您的控制器将在ng-view内部使用,则不需要等待路由事件。如果你知道你的控制器不会,你会的。如果您不确定,您必须明确允许这两种可能性。订阅$ routeChangeSuccess是不够的;如果$ routeParams尚未填充,则只会看到该事件:
module.controller('FooCtrl',$routeParams) { // $routeParams will already be populated // here if this controller is used within ng-view $scope.$on('$routeChangeSuccess',function() { // $routeParams will be populated here if // this controller is used outside ng-view }); );