Refre sh модель маршрута приложения после входа в систему с тлеющим октановым числом - PullRequest
1 голос
/ 17 апреля 2020

У меня есть шаблон приложения с компонентом боковой панели. Этот компонент боковой панели передается модели маршрута приложения для отображения в списке. Маршрут приложения проверяет, прошел ли пользователь аутентификацию, и если нет, пропускает загрузку модели. Индексный маршрут не является защищенным маршрутом, поэтому он все равно будет отображаться, когда он не вошел в систему, просто без указания пользователем данных c. Когда пользователь входит в систему или пытается использовать защищенный маршрут, он перенаправляется на маршрут входа в систему и возвращается к предпринятому переходу или индексу маршрута.

Похоже, нет никакого способа заставить хук модели маршрута приложения обновить sh после входа в систему. Я попытался перенести загрузку данных из маршрута приложения в службу и вызвать метод refre sh для службы из маршрута входа в систему, но это привело к той же проблеме.

Итак, мой главный Вопрос в том, каков рекомендуемый подход к загрузке данных после входа в систему, который необходим в шаблоне приложения? Можно ли переместить этот компонент боковой панели в другой шаблон, доступный только после входа в систему? Это кажется сложнее, чем должно быть, поэтому я предполагаю, что мне здесь не хватает некоторых базовых c концепций с потоком данных между маршрутами / компонентами! Спасибо!

Мой маршрут приложения (приложение / маршруты / приложение. js)

import Route from "@ember/routing/route";
import { inject as service } from "@ember/service";

export default class ApplicationRoute extends Route {
  @service router;
  @service session;

  model() {
    if (this.get('session').get('isAuthenticated'))
    {
      return this.store.findAll("project");
    }
  } 
}

Шаблон приложения (app / templates / application.hbs)

<HeadLayout />
<div class="wrapper">
    <SideBar @projects={{this.model}} />

    <div id="content">
        <NavBar />
        <div>
            {{outlet}}
        </div>
    </div>
</div>

Компонент боковой панели (приложение / компоненты / side-bar.hbs)

<nav id="sidebar">
    <div class="container">        
        <div class="sidebar-content">
            ...
            {{#if this.session.isAuthenticated}}                
                <div class="sidebar-projects">
                        ...
                        <div class="list-group">
                            {{#each this.projects as |project|}}
                                <button type="button">
                                    {{project.name}}
                                </button>
                            {{/each}}
                        </div>
                    </div>   
            {{else}}
                <p>Login to access projects.</p>
            {{/if}}
        </div>
    </div>
</nav>

Мой маршрутизатор (приложение / маршрутизатор. js)

import EmberRouter from '@ember/routing/router';
import config from './config/environment';

export default class Router extends EmberRouter {
  location = config.locationType;
  rootURL = config.rootURL;
}

Router.map(function() {
  this.route('login');

  this.authenticatedRoute('projects', { path: '/projects'}, function() {
    this.authenticatedRoute('new');
    this.authenticatedRoute('edit');
    this.authenticatedRoute('project', { path: ':project_id' });    
  });

  this.authenticatedRoute('photos', { path: '/photos'}, function() {
    this.authenticatedRoute('photo', {path: ':photo_id'});
    });
});

1 Ответ

1 голос
/ 17 апреля 2020

Вы можете использовать событие authenticationSucceeded в услуге session, а затем позвонить refresh. Так что я думаю, что этот конструктор для вашего маршрута может сделать свое дело:

constructor() {
  super(...arguments)
  this.session.on('authenticationSucceeded', () => this.refresh());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...