8

我在一个我无法看透的问题上被困了大约一天。

我在 users.js.coffee 文件中有以下代码:

app = angular.module("app", ["ngResource"])
app.config ['$routeProvider', '$locationProvider', ($routeProvider, $locationProvider) ->
  $locationProvider.html5Mode(true)
  $routeProvider.when('/users/:id', {templateUrl: '/users/:id.json', controller: UserCtrl})
  $routeProvider.when('/users/:id/videos', {templateUrl: '/users/:id/videos.json', controller: UserCtrl})
]

app.factory "User", ["$resource", ($resource) ->
  $resource("/users/:id", {id: "@id"}, {
    show: {method: "GET"}, 
    videos: {method: "GET", isArray:true}
    })
]

@UserCtrl = ["$scope", "$location", "$route", "http", "$routeParams", "User", ($scope, $location, $route, $http, $routeParams, User) ->
  console.log($location)//LocationUrl {$$parse: function, $$compose: function, $$rewriteAppUrl: function, $$protocol: "http", $$host: "localhost"…}

  console.log($route)//Object {routes: Object, reload: function}
  console.log($routeParams)//Object {} 

]

为什么 $routeParams 会是一个空对象?如果我在视图中调用 $route.current.params,它会显示适当的参数。但不在控制器中。更重要的是,我不能在控制器中调用 $route.current.params,因为“当前”还没有定义。

4

4 回答 4

7

我有同样的问题。如果没有ng-view ,路由将不起作用。刚刚有一个ng-view你会得到你的 $routeParams。

问候

于 2013-06-28T20:10:03.563 回答
2

如果您使用路由到 ng-view 控制器的外部控制器(如顶栏或页面控制器),您需要订阅“$routeChangeSuccess”发出消息。

如果您不是接收控制器,则路由更改成功是异步的。这个 SO 答案给出了更完整的答案: $routeParams is empty in main controller

但这是 tldr;

$scope.$on('$routeChangeSuccess', function() {
  // $routeParams should be populated here
});
于 2014-11-12T00:07:47.787 回答
1

It looks like $routeParams is not available at controller initialization time to controllers outside of those routed via $routeProvider / ng-view. (At least in angular 1.0.8)

If you want to access the route parameters in those outer controllers you can use $location.search().<param_name>

于 2014-05-28T01:02:39.617 回答
0

您的路线指向您的 api 路线。它们应该是要渲染的模板的路径:

@App = angular.module('app',['ngResource'])
  .config(['$routeProvider'], ($routeProvider) ->
    $routeProvider
      .when('/users',
        templateUrl: 'users/index.html',
        controller: 'UsersIndexCtrl')
      .when('/users/:id',
        templateUrl: 'users/show.html',
        controller: 'UsersShowCtrl')
      .otherwise(
        redirectTo: '/users'
    )])

然后,比如说,您的用户索引控制器可能看起来像:

App.controller 'UsersIndexCtrl',['$scope','$location','User', ($scope, $location, User) ->

  $scope.users = User.query()

  $scope.onClickHandlerToRoute = (user)->
    $location.path "path/to/show/user/#{user.id}"

您不需要注入 $http,因为您已经在使用 ngResource REST 抽象。

于 2013-06-03T02:56:27.853 回答