我有一个非常简单的Angular应用程序,我已经提炼到以下内容:
var napp = angular.module('Napp',['ngResource']);
var CompanyCtrl = function($scope, $routeParams, $location, $resource) {
console.log($routeParams);
};
napp.config(['$routeProvider', function($routeProvider) {
$routeProvider
.when('/company/edit/:id',
{templateUrl: '/partials/edit', controller: 'CompanyCtrl'}
);
}]);
和HTML:
<div ng-controller="CompanyCtrl"></div>
当我记录$ routeParams时,它出现空白。当我使用.otherwise()时,它将加载我在那里指定的任何内容。知道我错过了什么吗?
答案 0 :(得分:10)
你有几个错误:
您已在视图(<div ng-controller="CompanyCtrl"></div>
)和$ routeProvider(.when('/company/edit/:id', {templateUrl: '/partials/edit', controller: 'CompanyCtrl'}
)中的两个位置指定了控制器。我将删除视图中的那个。
在$ routeProvider中指定控制器时,你必须在模块中注册控制器(无论如何你应该真的这样做,最好避免使用全局控制器)。请napp.controller('CompanyCtrl', function ...
代替var CompanyCtrl = function ...
。
当您使用$ route服务时,您需要指定ng-view(不确定您是否这样做)
新代码:
var napp = angular.module('Napp', ['ngResource']);
napp.controller('CompanyCtrl', function ($scope, $routeParams, $location, $resource) {
console.log($routeParams);
});
napp.config(['$routeProvider', function ($routeProvider) {
$routeProvider
.when('/company/edit/:id',
{templateUrl: '/partials/edit', controller: 'CompanyCtrl'}
);
}]);
模板(/ parials / edit)
<div> ... </div>
和app(index.html或其他东西)
... <body> <div ng-view></div> </body>
我创建了一个工作的plunker示例:http://plnkr.co/edit/PQXke2d1IEJfh2BKNE23?p=preview
答案 1 :(得分:9)
首先尝试使用
$locationProvider.html5Mode(true);
那应该修复你的起始代码。然后调整代码以支持非pushState浏览器。
希望这有帮助!
答案 2 :(得分:3)
不确定这是否有帮助,但我自己就遇到过这个问题,并发现我无法记录路线参数,直到我有一些东西绑定它们。
所以,
路由器:
var myApp = angular.module('myApp', []);
myApp.config(function($routeProvider){
$routeProvider.when('/projects/:id',
{templateUrl: '/views/projects/show.html', controller: 'ProjectCtrl'}
);
});
控制器:
myApp.controller('ProjectCtrl', function($scope, $routeParams){
$scope.id = $routeParams.id;
console.log('test');
});
查看:
<h1>{{ id }}</h1>
当我从视图中删除“{{id}}”时,没有记录任何内容并且$ routeParams为空,至少在控制器实例化时是这样。正如上面的一些答案所指出的那样,路径参数是异步传递的,因此不会执行没有绑定到该属性的控制器。所以,不确定你已经从你的片段中提取了什么,但希望这会有所帮助!
答案 3 :(得分:2)
如果您使用的是ui-router
而不是ngRoute
,则可能会发生这种情况(不在OP的情况下)。
如果是这种情况,请使用$stateParams
代替$routeParams
。
答案 4 :(得分:2)
当然会是空白的。 RouteParams是异步加载的,因此您需要等待它获取参数。把它放在你的控制器中:
$scope.$on('$routeChangeSuccess', function() {
console.log($routeParams);
});
答案 5 :(得分:0)
它对我有用http://plunker.co/edit/ziLG1cZg8D8cYoiDcWRg?p=preview
但是你的代码中有一些错误:
您的代码中似乎没有ngView。 $routeProvider
使用ngView
知道应该在哪里插入模板的内容。所以你需要在页面的某个地方。
您在两个地方指定了CompanyCtrl
。您应该使用$routeProvider
在ng-controller
或您的模板中指定它。我喜欢在模板中指定它,但这只是个人偏好。
虽然不是错误,但您在全局范围内指定了CompanyCtrl
,而不是使用Napp
在Napp.controller(name, fn)
模块中注册它。
希望这有帮助!
你可以随时在freenode上的#angularjs irc频道上播放:总是有活跃的人准备帮助
答案 6 :(得分:0)
您的templateUrl
是否指向无效模板?
当您将templateUrl
更改为未存在的文件时,您会注意到将不再填充$routeParams
(因为AngularJS在解析模板时检测到错误)。
为了您的方便,我创建了一个带有代码的工作plnkr,您可以复制并粘贴以使您的应用程序正常工作:
http://plnkr.co/edit/Yabp4c9zmDGQsUOa2epZ?p=preview
单击示例中的链接后,您将看到路由器正在运行。
希望有所帮助!