В одном из моих шаблонов маршрутов Angular 2 ( FirstComponent ) у меня есть кнопка
first.component.html
<div class="button" click="routeWithData()">Pass data and route</div>
Моя цель - достичь:
Нажатие кнопки -> маршрут к другому компоненту с сохранением данных и без использования другого компонента в качестве директивы.
Это то, что я пытался ...
1-й ПОДХОД
В том же виде я храню сбор одних и тех же данных на основе взаимодействия с пользователем.
first.component.ts
export class FirstComponent {
constructor(private _router: Router) { }
property1: number;
property2: string;
property3: TypeXY; // this a class, not a primitive type
// here some class methods set the properties above
// DOM events
routeWithData(){
// here route
}
}
Обычно я бы маршрут SecondComponent по
this._router.navigate(['SecondComponent']);
в конце концов, передавая данные
this._router.navigate(['SecondComponent', {p1: this.property1, p2: property2 }]);
тогда как определение связи с параметрами будет
@RouteConfig([
// ...
{ path: '/SecondComponent/:p1:p2', name: 'SecondComponent', component: SecondComponent}
)]
Проблема с этим подходом состоит в том, что я предполагаю, что не могу передать сложные данные (например, объект как property3) в url;
2-й ПОДХОД
Альтернативой может быть включение SecondComponent в качестве директивы в FirstComponent.
<SecondComponent [p3]="property3"></SecondComponent>
Однако я хочу направить к этому компоненту, а не включать его!
3-й ПОДХОД
Наиболее жизнеспособным решением, которое я вижу здесь, было бы использование службы (например, FirstComponentService) для
- сохранить данные (_firstComponentService.storeData ()) на routeWithData () в FirstComponent
- получить данные (_firstComponentService.retrieveData ()) в ngOnInit () в SecondComponent
Хотя такой подход кажется вполне жизнеспособным, мне интересно, является ли это самым простым / изящным способом достижения цели.
В общем, я хотел бы знать, пропускаю ли я другие потенциальные подходы для передачи данных между компонентами, особенно с меньшим количеством кода
источник
Pass data using Query Parameters
это то, что я искал. Ваша ссылка спасла мой день.state
проверки PR для более подробной информации. Немного полезной информации здесьОтветы:
обновление 4.0.0
См. Angular docs для более подробной информации https://angular.io/guide/router#fetch-data-before-navigating
оригинал
Использование сервиса - путь. В параметрах маршрута вы должны передавать только те данные, которые вы хотите отобразить в строке URL браузера.
Смотрите также https://angular.io/docs/ts/latest/cookbook/component-communication.html#!#bidirectional-service
Маршрутизатор, поставляемый с RC.4, вновь представляет
data
См. Также Plunker на https://github.com/angular/angular/issues/9757#issuecomment-229847781.
источник
ngOnInit() { this.myVar = this.route.snapshot.data['some_data']; }
NavigationExtras
- stackoverflow.com/a/54879389/1148107Я думаю, так как у нас нет $ rootScope в angular 2, как в angular 1.x. Мы можем использовать общий сервис / класс angular 2, когда в ngOnDestroy передают данные в сервис и после маршрутизации получают данные из сервиса в функции ngOnInit :
Здесь я использую DataService для совместного использования объекта hero:
Передать объект из компонента первой страницы:
Взять объект из компонента второй страницы:
Вот пример: плункер
источник
this.hero = this.dataService.hero
? Получу ли я значения?Ну, самый простой способ сделать это в Angular 6 или других версиях, я надеюсь, это просто определить ваш путь с количеством данных, которые вы хотите передать
как вы можете видеть из моего определения маршрутов, я добавил,
/:id
чтобы стоять, чтобы данные, которые я хочу передать компоненту через навигацию маршрутизатора. Поэтому ваш код будет выглядетьдля того, чтобы прочитать
id
на компоненте, просто импортируйтеActivatedRoute
каки на том
ngOnInit
, где вы получаете данныеВы можете прочитать больше в этой статье https://www.tektutorialshub.com/angular-passing-parameters-to-route/
источник
В Angular 7.2.0 введен новый способ передачи данных при навигации между маршрутизируемыми компонентами:
Или:
Чтобы прочитать состояние, вы можете получить доступ к
window.history.state
свойству после завершения навигации:источник
window.history.state
возвращает что-то вроде,{navigationId: 2}
вместо того, чтобы вернуть объект, который я передал.navigationId
со значением добавляется. Если данные не добавлены,navigationId
будет отображаться только Посмотрите переданные данные, вернитесь назад или обновите свое приложение и повторно запустите действие, которое добавляет данные в маршрут и переходит к следующему маршруту (например, нажатие кнопки). Это добавит ваши данные к объекту.Какой-то супер умный человек (tmburnell), который не я, предлагает переписать данные маршрута:
Как видно здесь в комментариях.
Я надеюсь, что кто-то найдет это полезным
источник
Я этот другой подход не подходит для этого вопроса. Я считаю, что лучше всего использовать Query-Parameter по
Router
угловым параметрам , которые имеют 2 способа:С помощью этого кода вы можете перейти к
url
поparams
вашей HTML - код:Вы должны внедрить маршрутизатор в вашем
constructor
подобном:Теперь используйте это как:
Теперь, если вы хотите читать из
Router
другого,Component
вы должны использоватьActivatedRoute
как:и
subscribe
это:источник
Это 2019 год, и многие ответы здесь будут работать, в зависимости от того, что вы хотите сделать. Если вы хотите передать какое-то внутреннее состояние, невидимое в URL (params, query), вы можете использовать его
state
с 7.2 (как я узнал) только сегодня :)).Из блога (титры Томаша Кула) - вы переходите к маршруту ....
... из тс:
this.router.navigateByUrl('/details', { state: { hello: 'world' } });
... из шаблона HTML:
<a routerLink="/details" [state]="{ hello: 'world' }">Go</a>
И подобрать его в целевой компонент:
Поздно, но надеюсь, это поможет кому-то с недавним ангулярным.
источник
Решение с ActiveRoute (если вы хотите передать объект по маршруту - используйте JSON.stringfy / JSON.parse):
Подготовьте объект перед отправкой:
Получите ваш объект в компоненте назначения:
источник
super.ngOnInit();
?Третий подход является наиболее распространенным способом обмена данными между компонентами. Вы можете добавить услугу товара, которую хотите использовать в связанном компоненте.
источник
Пройдите, используя JSON
источник
используйте общую службу для хранения данных с пользовательским индексом. затем отправьте этот пользовательский индекс с помощью queryParam. этот подход более гибкий .
,
источник
скажи, что у тебя есть
и вы хотите передать данные в component2.ts .
в component1.ts это переменная с данными скажем
источник
Вы можете использовать BehaviorSubject для обмена данными между маршрутизируемыми компонентами. BehaviorSubject содержит одно значение. Когда он подписан, он немедленно выдает значение. Предмет не имеет значения.
В сервисе.
В компоненте вы можете подписаться на этот BehaviorSubject.
Примечание: тема не будет работать здесь, нужно использовать только тему поведения.
источник