Angular 2.0.2: ActivatedRoute пуст в Сервисе

Я хочу использовать ActivatedRoute для получения параметров маршрута в сервисе, как в компоненте. Однако, когда я внедряю объект ActivatedRoute в Сервис, он содержит пустую переменную params

Я создал плункер, который воспроизводит поведение: http://plnkr.co/edit/sckmDYnpIlZUbqqB3gli

Обратите внимание, что целью является использование параметра в сервисе, а не в компоненте, способ установки плунжера предназначен просто для демонстрации проблемы.

Компонент (test получен):

 export class Component implements OnInit {
  result: string;

  constructor(private route: ActivatedRoute) {
  }

  ngOnInit() {
    this.route.params.subscribe(params => {
      this.result = params['test'];
    });
  }
}

Служба (test не получена):

 export class Service {
  result: string;

  constructor(private route: ActivatedRoute) {
    this.getData();
  }

  getData() {
    this.route.params.subscribe(params => {
      this.result = params['test'];
    });
  }
}
18 голосов | спросил Steve Van Opstal 11 +03002016-10-11T16:06:59+03:00312016bEurope/MoscowTue, 11 Oct 2016 16:06:59 +0300 2016, 16:06:59

3 ответа


0

Service здесь есть синглтон, который принадлежит корневому инжектору и внедряется с помощью root ActivatedRoute экземпляр .

Розетки получают собственный инжектор и собственный ActivatedRoute экземпляр .

ответил estus 11 +03002016-10-11T17:53:23+03:00312016bEurope/MoscowTue, 11 Oct 2016 17:53:23 +0300 2016, 17:53:23
0

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

Следующее решение получает параметр непосредственно от маршрутизатора и позволяет службе иметь один экземпляр:

 export class Service {
  result: string;

  constructor(private router: Router) {
    this.result = router.routerState.snapshot.root.children[0].url[index].path
  }
}

или как наблюдаемое:

 export class Service {
  result: string;

  constructor(private router: Router) {
    this.router.routerState.root.children[0].url.map((url) => {
      this.result = url[index].path;
    });
  }
}

альтернативно, когда routerState недоступен:

 export class Service {
  result: string;

  constructor(private router: Router) {
    this.router.parseUrl(this.router.url).root.children.primary.segments[index].toString();
  }
}

Индекс - это позиция параметра в URL.

ответил Steve Van Opstal 12 +03002016-10-12T20:16:31+03:00312016bEurope/MoscowWed, 12 Oct 2016 20:16:31 +0300 2016, 20:16:31
0

Я не вижу директивы routerLink в предоставленном вами коде Plunker.

Вам нужно использовать директиву routerLink для перехода к вашему компоненту, где вы предоставляете параметр, тогда только вы можете получить его. Например:

<a routerLink="/myparam" >Click here to go to main component</a>
ответил siva636 11 +03002016-10-11T17:17:17+03:00312016bEurope/MoscowTue, 11 Oct 2016 17:17:17 +0300 2016, 17:17:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132