2013-03-14 213 views
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("https://stackoverflow.com/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,因爲「當前」還沒有定義。

+0

這與您的問題無關,但我不認爲您在使用'respond_with'時可以使用'to_json'。您必須提供一個對象,並且您的控制器將根據請求的格式調用適當的響應者。 – 2013-03-14 09:05:57

+0

我認爲你一般是對的,除非我需要像@ user.to_json(包括:視頻)那樣抓取關聯。我只是在那裏明確說明,直到我能弄清楚爲什麼我沒有得到適當的迴應。 – jflores 2013-03-14 13:29:06

+0

在json響應中包含關聯的首選方法是在模型中重寫'as_json'。至於你的問題,你可以設置你的瀏覽器記錄xhr請求(鉻做到這一點),併發布在這裏來回發生什麼? – 2013-03-14 14:52:19

回答

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抽象。

7

我有同樣的問題。如果沒有ng-view,路由將不起作用。剛剛有一個ng-view你會得到你的$ routeParams。

問候

1

它看起來像$ routeParams不可在控制器初始化時間控制器那些通過$ routeProvider/NG-觀點路由之外。 (至少在角1.0.8)

如果要訪問的那些外控制器的路由參數可以如果使用一個外部控制器使用$location.search().<param_name>

2

到路由到NG-視圖控制器(如頂欄或頁面控制器),則需要訂閱'$ routeChangeSuccess'發出的消息。

如果您不是接收控制器,則路由更改成功爲異步。 這SO答案給出了一個更完整的答案: $routeParams is empty in main controller

但這是tldr;

$scope.$on('$routeChangeSuccess', function() { 
    // $routeParams should be populated here 
});