6

Вот plunker играть:вручную изменять параметры маршрута приводит к несовместимым пользовательского интерфейса

https://plnkr.co/edit/qTjftING3Hk2fwN36bQa?p=preview

Все работает хорошо, за исключением того, когда вы вручную изменение параметра идентификатор в строке URL-адрес , потому что тогда выпадающий проект не показывает новый projectId как текущий проект. Это происходит, когда пользователь сохраняет URL-адрес в качестве любимой ссылки и копирует/вставляет его в строку url! Обычный случай, который я бы сказал!

Чтобы исправить это, я могу прослушивать изменения route.params в TestsListComponent и добавить чек с помощью sharedService/EventEmitter, чтобы измененный идентификатор существовал в этом выпадающем списке. Возвращаемое значение bool существуетProjectId внутри TestsListComponent решает, что я должен перенаправить на страницу /projects, потому что идентификатор не существует.

Но, честно говоря, перенаправление с TestsListComponent слишком поздно, по крайней мере, с точки зрения пользователя, потому что route projects/:id/tests уже активирован.

Как вы исправите это неправильное поведение?

P.S.

  • Может быть, это своего рода глобальное изменение Params я могу слушать и проверять путь и его идентификатор внутри ProjectsListComponent, что помогло бы!

  • Если кто-то знает, как отредактировать строку url plunkr в режиме окна, чтобы проверить эту несогласованность, пожалуйста, дайте мне знать, как вы сделали этот readlly url bar редактируемым ... даже копирование URL-адреса в новую вкладку не работает , так как я получаю plunkr не нашли ошибку ... => ОТВЕТ

    1. нагрузки на plunkr и активировать режим окна
    2. В режиме окна копирования/вставки URL в новую вкладку
    3. Когда то есть вставленный URL: https://run.plnkr.co/LhwcQjzWHsRUda8H/projects/1/schoolclasses
    4. Сделать это, что URL: https://run.plnkr.co/LhwcQjzWHsRUda8H/#/projects/1/schoolclasses
    5. и изменение пары: https://run.plnkr.co/LhwcQjzWHsRUda8H/#/projects/2/schoolclasses
    6. Если вы не добавить хэш, то вы получите не найден 404.
+0

Я не полностью прочитал ваш вопрос. Я только что видел: «У меня просто ощущение, что маршрутизатор должен предлагать действительно бескомпромиссный маршрут с помощью всего лишь пути:« Проекты /: id », такие как angularJS ui router!» Что делать? То, что вы можете сделать, это маршрутизатор с только «path» ** и ** 'children' (но без компонента). –

+0

Давайте просто предположим, что у меня есть компонент без полей/проекты /: id с дочерним свойством. Как только пользователь изменит текущий проект проекта, вы получите активизацию, чего я не хочу. Я хочу, чтобы промежуточный шаг, который пользователь нажимает на кнопку «Открыть», тогда должен быть активирован маршрут/проекты по умолчанию для дочерних объектов /: id/overview. У вас есть решение для этого случая? – Pascal

+0

Только 'redirectTo'. Я не понимаю, почему ты этого не хочешь. –

ответ

0

Я не уверен, если я правильно понимаю ваш вопрос, во всяком случае вот мой plunkr.

this.router.events.subscribe(event => { 

     if (event instanceof RoutesRecognized) 
     { 
      var first=event.state.root.firstChild.firstChild; 
      var id = first && event.state.root.firstChild.firstChild.params['id']; 
      console.debug('recognized', id); 
      this.currentProject = this.projects[+id-1]; 

      console.log(this.currentProject); 
     } 
    }); 

Просто перейдите к #/projects/1/tests.

+0

COPY и PASTE: ссылка https://run.plnkr.co/JjcYBTtgvVwS90dk/#/projects/2/tests на вкладку браузера. Ожидается, что я получу идентификатор CURRENT в текущем проекте в раскрывающемся списке. Его НЕ о навигации с элементами ui, например, щелчком мыши. Смотрите также мой комментарий к пользователю Ibrahim выше. – Pascal

+0

Я обновил plunkr, он будет работать с копией и вставкой – kemsky

+0

Спасибо за вашу помощь Да, plunkr работает, но ... Я изучил ваш код, и для меня есть один облом: this.currentProject = this.projects [this. service.id]; Я НЕ МОЖЕТЕ жестко указывать идентификатор базы данных по индексу списка проектов по очевидной причине: 10 проектов, но один с идентификатором 20. Эти идентификаторы должны быть не такими последовательными, как 1,2,3,4 и т. Д. Http: //stackoverflow.com/questions/14642013/why-are-there-gaps-in-my-identity-column-values ​​ – Pascal

0

Там нет глобального PARAMS изменить можно подписаться.

Один подход заключается, чтобы найти маршрут и его Params, начиная с корневого маршрутизатора:

console.log('router', this.router.routerState.root.firstChild.firstChild && this.router.routerState.root.firstChild.firstChild.snapshot.params); 

Это может быть сделано в течение this.router.events.subscribe((val) => { или в пределах маршрутизатора охранником как canActivate или resolvehttps://angular.io/docs/ts/latest/guide/router.html#!#guards

+1

Код не компилируется, так как свойство currentRouterState экземпляра маршрутизатора является приватным! Просто бессмысленный побочный комментарий: с angularJS у меня было изменение глобального маршрута в m y app.js, но без ориентации компонента: P UPDATE Я только что видел, что есть общедоступное свойство routerState, я пытаюсь это сделать! – Pascal

+0

Публичный геттер выглядит как «routerState». Я получил 'currentRouterState' из' console.log() 'и в Plunker он работал. –

+0

ok о приватном текущем RouterState Я попробовал это в своем приложении для ввода текста. Возможно, в plunkr такие вещи, как private, игнорируются ROFL – Pascal

1

обновить приложение .routes.TS файл, как показано ниже, и использовать HashLocationStrategy, для справки: HashLocationStrategy

import {Routes, RouterModule} from '@angular/router'; 
import ProjectListComponent from './projects-list.component'; 
import TestsListComponent from './tests-list.component'; 
import OverviewComponent from './overview.component'; 
import {LocationStrategy, HashLocationStrategy} from '@angular/common'; 


export const routes: Routes = [ 
    { path: '', redirectTo: 'projects', pathMatch: 'full' }, 
    { 
     path: 'projects', component: ProjectListComponent, 
     children: [ 
      { path: ':id', redirectTo: ':id', pathMatch: 'full' }, 
      { 
       path: ':id', component: OverviewComponent, 
       children: [ 
        { path: '', redirectTo: 'tests', pathMatch: 'full' }, 
        { path: 'tests', component: TestsListComponent }, 

       ] 
     ] 
    } 
]; 

export const appRoutingProviders: any[] = [ 
    { 
     provide: LocationStrategy, 
     useClass: HashLocationStrategy 
    } 
]; 

export const routing = RouterModule.forRoot(routes); 
+0

Спасибо за подсказку о местоположении хэша. Действительно, я использую это локально, но забыл установить его в plunkr.Но помните мой вопрос: «Как бы вы исправили это неправильное поведение». Это еще не решено, потому что когда вы вставляете ссылку в браузер с идентификатором 7, событие navstart не запускается только событие navend, но ПОСЛЕ изменения параметров компонента обзора/тестов. Это означает, что его waaay слишком поздно, чтобы перехватить id. – Pascal