2015-10-12 2 views
0

Некоторые Я новичок в маршрутизации и одностраничных веб-приложениях, но я пытался правильно изучить Angular. Есть некоторые проблемы, с которыми я столкнулся, и несколько странных вопросов. Я последовал за руководство по структурирования каталога и моя выглядит примерно так:

app/ 
    components/ 
     profile/ 
      profile.html 
      ProfileModel.js 
      ProfileController.js 
      ProfileFactory.js 
    app.module.js 
    app.routes.js 

Мой главный модуль находится в app.module.js и зависимость инъецируют ngRoute и profile.app (модуль для просмотра профиля из ProfileModel.js). Он объявлен как это:

angular 
    .module('app', ['ngRoute', 'profile.app']) 
    .controller('MainController', MainController); 

function MainController() { 
    this.message = 'This is the home page'; 
} 

Тогда в моем app.routes.js файле, я объявивших все маршруты потребности приложений (до сих пор только один, который является профиль):

angular 
    .module('app') 
    .config(routeConfig); 

routeConfig.$inject = ['$locationProvider', '$routeProvider']; 

function routeConfig ($locationProvider, $routeProvider) { 
    $routeProvider 
     .when('/user/:user_id', { 
       templateUrl: '/app/components/profile/profile.html', 
       controller: 'ProfileController', 
       controllerAs: 'profile' 
      } 
     ) 
    $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
    }); 
} 

Это мой ProfileController.js :

angular 
    .module('app.profile') 
    .controller('ProfileController', ProfileController); 

ProfileController.$inject = ['ProfileFactory', '$routeParams']; 

function ProfileController(ProfileFactory, $routeParams) { 
    var vm = this; 

    vm.user_id = $routeParams.user; 

    console.log($routeParams.user_id); 
    vm = ProfileFactory.userProfile(vm.user_id); //Gets the profile of the user and sets to to vm 


} 

У меня есть два основных вопроса. $routeParams.user_id зарегистрирован как ничто, несмотря на то, что я определил маршрут в app.routes.js. Это странно, потому что у меня есть директива ng-view в моем index.html (файл HTML, который содержит каждый файл .js). Это означает, что я должен иметь немедленный доступ к параметрам маршрутизации после создания экземпляра контроллера и его зависимостей. Однако, когда я перехожу на http://example.com/user/1, я ничего не регистрирую (неопределенный).

Мой второй вопрос: я включил ngRoute как зависимость в profile.app и мой основной модуль (в котором profile.app - зависимость). Тем не менее, я позже удалил ngRoute с profile.app в качестве зависимости, но я оставил инъекцию $routeParams внутри моего ProfileController, и AngularJS не жаловался вообще. Это кажется странным, потому что зависимость больше не присутствует явно внутри profile.app. Так почему же я все еще могу, кажется, ввести $routeParams, несмотря на отсутствие ngRoute в моем модуле profile.app? Это потому, что он получает ngRoute от основного модуля?

+0

Проверьте, если вы сделали синтаксис ошибка в этой строке vm.user_id = $ routeParams.user; Должно ли это не быть vm.user_id = $ routeParams.user_id как определено на ваших маршрутах? –

+0

Но почему это должно иметь значение? 'Console.log ($ routeParams.user_id)' logs undefined –

+0

В этом случае это не имеет значения. Я просто думал, что vm.user_id не определено, потому что вы назначили ему неопределенную переменную. Попробуйте использовать мой ответ ниже и посмотрите, что произойдет. –

ответ

1

Я считаю, что проблема в том, что вы настраиваете controllerAs to 'profile', но затем в контроллере вы пишете var vm = this;

Эти два нужно быть таким же, чтобы вы могли писать controllerAs: 'vm' или var profile = this;

+0

Да, просто попробовал, спасибо за совет! К сожалению, это не изменило результат –

+0

Это определенно является частью проблемы. Я пробовал это в своем текущем угловом приложении, над которым я работаю. Я изменил контроллер на что-то другое, кроме vm, которое я использовал в контроллере (var vm = this), и он сломал код. Другими словами, у меня был controllerAs: 'asdf' и var vm = this; И все было не определено в моем контроллере. Когда я изменил назад controllerAs: 'vm' все вернулось к норме. –

+0

Попробуйте console.log ($ scope), и вы увидите, что есть объект с именем profile, но в представлении вы пытаетесь получить доступ к vm, которого нет в объекте $ scope вообще. –

Смежные вопросы