Маршрутизация Angular 2: родительский параметр обработки

Я столкнулся с ошибкой с маршрутизацией Angular 2. (Используя angular/router2.0.0-rc1)

Вот как выглядят маршруты:

tabs/editItem (For creating a new item)
tabs/id/editItem (For editing an item)
tabs/id/itemStuff
tabs/id/differentStuff

В моем компоненте вкладок мне нужно отключить параметры itemStuff и DifferentStuff, когда идентификатор не указан, но включить, когда есть идентификатор.

Я использовал NgIf для идентификатора в своем шаблоне и:

  routerOnActivate(curr: RouteSegment) {
    if(curr.getParam('pId') == null)
      return;

    this.pId = +curr.getParam('pId');
  }

Проблема в том, что я не могу получить доступ к параметрам маршрутов со своей страницы вкладок, потому что «routerOnActivate» вызывается только в конечной точке маршрутов. Похоже, что вариант состоит в том, чтобы дочерние элементы выполняли проверку для меня, а затем отправляли событие обратно для обновления компонента вкладок, но это кажется уродливым и неправильным способом сделать это.

Любая помощь приветствуется!

TLDR: как родительский компонент может получить доступ к параметру и обработать его


person rgrambo    schedule 04.07.2016    source источник


Ответы (2)


Воскрешая это, так как я только что столкнулся с этой проблемой. Вы должны иметь возможность получать свойства от родителя, поднимаясь вверх по дереву ActivatedRoute.

  getId(route: ActivatedRouteSnapshot){
      let id = route.params["id"];
      if(id)
      {
        return id;
      }
      if(route.parent)
      {
        return this.getId(route.parent)
      }
      return undefined;
  }
person rrfenton    schedule 14.09.2016

Во-первых, лучше всего обновить свой проект, чтобы использовать v3 маршрутизатора. Маршрутизатор v2 больше не разрабатывается, и маршрутизатор v3 работает совершенно иначе, чем маршрутизатор v2.

Что касается вашей проблемы с родительским/дочерним параметром, к сожалению, у вас будет немного та же проблема, что и в v3, в том, что дочерним маршрутам не заданы родительские параметры. Они доставляются через новый внедряемый компонент маршрутизатора ActivatedRoute, который содержит параметры только для данного маршрута, а не его родительского или дочернего элемента.

Такое поведение, по-видимому, предусмотрено дизайном, что означает, что вам нужно будет обрабатывать параметры в компонентах, которые «владеют» этим параметром, а затем сделать их доступными через отдельную службу для других ваших родительских/дочерних маршрутов.

Что касается обходного пути, я еще не видел никаких способов сделать это напрямую через компоненты маршрутизатора, но я бы сказал, что с постоянными изменениями в API маршрутизаторов обходные пути, вероятно, не являются стабильным вариантом.

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

Надеюсь это поможет!

person Ian Belcher    schedule 04.07.2016
comment
Благодарю вас! Я проверю обновление до v3 и, думаю, я буду работать с разделением проблем. :) - person rgrambo; 05.07.2016