Angular 8: передать данные на маршрутизатор - PullRequest
0 голосов
/ 15 октября 2019

У меня есть страница со списком продуктов, и я хочу передать идентификатор продукта маршрутизатору product /: id (я не хочу анализировать его по URL-адресу маршрутизатора). Какие варианты у меня есть? Могу ли я иметь что-то вроде Input() для компонента маршрутизатора?

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

Позвольте мне сначала получить это право!

У вас есть список предметов, и когда вы нажимаете на него, вам нужно перенаправить на общий маршрут, который отображает детали в отношении идентификатора предмета? Вы ищете способ передать идентификатор элемента в дочерний компонент, не передавая его в качестве параметра маршрута?

Это в основном совместное использование данных между компонентами. Есть 4 способа сделать это.

От родителя к ребенку: обмен данными через Input

Это, вероятно, самый распространенный и простой метод обмена данными. Он работает с помощью декоратора @Input(), позволяющего передавать данные через шаблон.

Дочерние к родителю: обмен данными через ViewChild

ViewChildпозволяет одному компоненту быть введенным в другой, предоставляя родителю доступ к его атрибутам и функциям. Однако одно предостережение заключается в том, что дочерний элемент не будет доступен до тех пор, пока представление не будет инициализировано. Это означает, что нам нужно реализовать хук жизненного цикла AfterViewInit для получения данных от дочернего элемента.

Дочерний элемент к родителю: обмен данными через Output() и EventEmitter

Этот подход идеален, когда вы хотите поделиться изменениями данных, которые происходят в таких вещах, как нажатия кнопок, записи форм и другие пользовательские события.

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

В дочернем элементе объявите переменную messageEvent с декоратором вывода и установите ее равной новому источнику событий. Затем создайте функцию с именем sendMessage, которая вызывает emit для этого события с сообщением, которое вы хотите отправить. Наконец, создайте кнопку для запуска этой функции.

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

Несвязанные компоненты: обмен данными со службой (рекомендуется)

При передаче данных между компонентами, у которых отсутствует прямое соединение, такими как братья и сестры, внуки и т. Д., Если у вас есть общий доступсервис . Когда у вас есть данные, которые всегда должны быть синхронизированы, я считаю RxJS BehaviorSubject очень полезным в этой ситуации.

Ниже приведен пример последнего подхода!

shared-service.ts

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';

@Injectable()
export class DataService {

  private messageSource = new BehaviorSubject('default message');
  currentMessage = this.messageSource.asObservable();

  constructor() { }

  changeMessage(message: string) {
    this.messageSource.next(message)
  }

}

parent.component.ts

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'app-parent',
  template: `
    {{message}}
  `,
  styleUrls: ['./sibling.component.css']
})
export class ParentComponent implements OnInit {

  message:string;

  constructor(private data: DataService) { }

  ngOnInit() {
    //subscribing to the updated data set
    this.data.currentMessage.subscribe(message => this.message = message)
  }

}

sibling.component.ts

import { Component, OnInit } from '@angular/core';
import { DataService } from "../data.service";

@Component({
  selector: 'app-sibling',
  template: `
    {{message}}
    <button (click)="newMessage()">New Message</button>
  `,
  styleUrls: ['./sibling.component.css']
})
export class SiblingComponent implements OnInit {

  message:string;

  constructor(private data: DataService) { }

  ngOnInit() {
    this.data.currentMessage.subscribe(message => this.message = message)
  }

  newMessage() {
    // triggering the shared service method
    this.data.changeMessage("Hello from Sibling")
  }

}

Я надеюсь, что этот подход работает.

Удачи!

1 голос
/ 15 октября 2019
import { Router } from '@angular/router';

constructor(private router: Router) { }

Использовать в качестве пути Переменная

В app.routes.ts

{ path: 'product/:id' , component: ProductComponent}

Как использоватьв html-файле

<a [routerLink]="['/product', product.id ]">Your link<a>

Здесь product.id - это значение, которое вы хотите передать

Как использовать в файле для машинописи

this.router.navigate(['/product', this.product.id]);

Здесь this.product.id - это значение, которое вы хотите передать

Использовать в качестве необязательного параметра

В app.routes.ts

{ path: 'product' , component: ProductComponent}

Как использовать в html-файле

<a [routerLink]="['/product', { id: product.id} ]">Your link<a>

Здесь product.id - это значение, которое вы хотите передать

Как использовать в файле машинописи

this.router.navigate(['/product',{ id : this.product.id} ]);

Здесь this.product.id - это значение, которое вы хотите передать

Использовать в качестве параметра запроса

В app.routes.ts

{ path: 'product' , component: ProductComponent}

Как использовать в html-файле

<a [routerLink]="['/product']" [queryParams]="{ id: product.id}">Your link<a>

Здесьproduct.id - это значение, которое вы хотите передать

Как использовать в файле для машинописи

this.router.navigate(['/product'], { queryParams: { id : this.product.id}});

Здесь this.product.id - это значениеты хочешь сдать

0 голосов
/ 15 октября 2019

Просто используйте id в качестве параметров маршрутизатора. Это лучшая практика.

<a routerLink='product/{{product.id}}'>Your link<a>
...