2015-03-17 3 views
0

По сути, целью является отображение страницы учетной записи, если пользователь вошел в систему, иначе перенаправляется на страницу входа.Ember.js: перенаправить в маршрутизатор, если в контроллере выполнено определенное условие?

У меня есть следующие маршруты:

App.Router.map(function() { 
    this.resource('account', { path: '/'}); 
    this.route('login', { path: '/login' }); 
}) 

Мой текущий код пытается получить доступ к атрибуту loggedIn в контроллере счета в маршруте:

App.AccountRoute = Ember.Route.extend({ 
    renderTemplate: function(controller) { 
    var loggedIn = controller.get('loggedIn'); // ERROR: controller undefined 
    if (!loggedIn) { 
     this.transitionTo('login'); 
    } 
    } 
}); 

Должен ли я реализовать эту логику в маршрутизаторе? Почему контроллер не определен в моем маршруте? Благодаря!

+0

ember-cli? Какие версии эмбрионов? – steveax

+1

вы должны сделать это в крюке beforeModel AccountRoute. – Kingpin2k

ответ

4

Вот несколько идей, которые могут помочь вам:

  1. Ваш контроллер не всегда существует. Он создается Ember, когда ему это нужно в первый раз. Вы можете использовать расширение Chrome для отладки Ember, чтобы узнать, какие контроллеры уже созданы. В вашем случае он должен быть доступен, хотя вы находитесь в крюке renderTemplate. В общем, переадресовывает должно быть сделано либо в beforeModel крючок или крючок redirect:

    redirect: function() { 
        if (!this.controller.get('loggedIn')) { 
         this.transitionTo('login'); 
        } 
    } 
    
  2. Рассмотрим перемещение логики аутентификации в службу Ember (example). Служба в Ember - это просто класс, который распространяется на Ember.Object. У вас будет возможность inject, что сервис во всех ваших контроллерах и маршрутах так будет всегда доступен.

  3. Еще лучше: рассмотрите возможность использования превосходного ember-simple-auth, который обрабатывает как аутентификацию, так и авторизацию. Это создаст session сервис доступным везде в вашем приложении, так что вы будете иметь возможность делать такие вещи, как:

    // Ensures the user is authenticated 
    if (!this.get('session.isAuthenticated')) { 
        this.transitionTo('login'); 
    } 
    

    Или еще лучше (так как вы не хотите, чтобы скопировать пасту, что материал везде):

    // This route is now authenticated! 
    App.AccountRoute = Ember.Route.extend(AuthenticatedRouteMixin, { 
        ... 
    } 
    

И многие другие классные вещи!

Кроме того, я вижу, что вы еще не используете Ember CLI. Я бы порекомендовал его, как только вы почувствуете себя более комфортно с Ember. Ember CLI - это будущее Ember, оно имеет немного другой синтаксис, но много замечательных вещей.

+0

Спасибо! Я не использую ember-cli, поэтому не уверен, могу ли я легко включить ember-simple-auto в свое приложение. Однако я нашел этот код через embercasts: https://github.com/embercasts/authentication-part-2/blob/master/public/js/app.js – melonccoli

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