Подтвердить что ты не робот

Angular router - должен ли isActive() идентифицировать основной маршрут, когда также открыты вторичные маршруты?

Я нахожу, что router.isActive возвращает false в любое время, когда вторичный маршрут открыт.

Является router.isActive подходящим для проверки 'am я on route (x)?' (например, страница платежей) - независимо от hashstates, параметров запроса и вторичных маршрутов.

Должен ли router.isActive быть правильным сервисом/вызовом, чтобы вывести это? Или он предназначен для чего-то более простого. Есть ли альтернатива? Должен ли написать мой собственный сервис?

например:.

  • Когда включено /second, router.isActive('second', true) === true
    • (хорошо)
  • Когда включено second(modal:my-modal), router.isActive('second', true) === false
    • Проблема: Теперь эта функция больше не помогает определить, находится ли я на второй странице
  • Когда включено /second, router.isActive('', false) === true. (неточные соответствия возвращают истинные родительские/дочерние состояния

Я создал доказательство концепции plnkr, для более легкого тестирования:

введите описание изображения здесь

4b9b3361

Ответ 1

Взглянув сюда на источник:

https://github.com/angular/angular/blob/master/packages/router/src/router.ts#L493

Итак, вы указываете urlTree или строку и требуется ли точное совпадение.

Давайте посмотрим, что он делает после этого.

return containsTree(this.currentUrlTree, urlTree, exact);

Итак, давайте посмотрим на containsTree.

https://github.com/angular/angular/blob/master/packages/router/src/url_tree.ts#L16

Похоже, что точное сравнение против a содержит против дерева в зависимости от значения exact.

Немного больше исследований ведет нас здесь:

export function shallowEqual(a: {[x: string]: any}, b: {[x: string]: any}): boolean {
  const k1 = Object.keys(a);
  const k2 = Object.keys(b);
  if (k1.length != k2.length) {
    return false;
  }
  let key: string;
  for (let i = 0; i < k1.length; i++) {
    key = k1[i];
    if (a[key] !== b[key]) {
      return false;
    }
  }


 return true;
}

Итак, похоже, что сравнения urlTree выполняются с использованием "общего" алгоритма неполного сравнения для определения точности. Это заставляет меня думать, что текущий метод isActive() недостаточно прочен (или был специально разработан таким образом), чтобы сделать определения на уровне детализации, в котором вы нуждаетесь.

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

Вероятно, стоит обсудить с ребятами Angular, чтобы узнать, есть ли способ, с помощью которого вы можете получить доступ к этой информации.