Как открыть информацию о продукте на другой странице?

#angular

#angular

Вопрос:

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

Вот как я отображаю свои элементы

  <div *ngFor="let plu of filteredPlu" class="col mb-4">
      <figure class="card">
        <img
          [src]="
            plu.img
              ? 'data:image/jpg;base64,'   plu.img
              : 'assets/images/no_image.jpg'
          "
          class="img-fluid img-plu"
        />
        <figcaption class="card-body">
          <h6 class="card-title mb-0">
            <a href="#" appHref [routerLink]="['../item/'   plu.id]"> // ON CLICK WHICH SHOULD SHOW DETAILS
              {{ plu.desc ? plu.desc : "NO TITLE" }}
            </a>
          </h6>
          <small>{{ plu.estesa ? plu.estesa : "-" }}</small>
          <span class="price-wrap d-block">{{
            plu.prezzo | currency: "EUR"
          }}</span>
          <button
            class="btn btn-sm mr-2 btn-outline-dark mt-2"
            (click)="
              variantiModal
                ? openVarianti(variantiModal, plu)
                : addToCart(plu)
            "
          >
            Personalizza
          </button>
          <button
            class="btn btn-sm btn-outline-success mt-2"
            (click)="addToCart(plu)"
          >
            Aggiungi al carrello
          </button>
        </figcaption>
      </figure>
    </div>
  

Итак, как вы можете видеть, у меня есть привязка, которая перенаправляет пользователя в /items / component, компонент, где я должен показывать информацию об этом элементе..

Но мне было интересно, как я могу передать в /items / весь объект plu целиком, или я должен выполнить новый вызов API, чтобы получить информацию об одном продукте?

Если это может быть полезно, моя маршрутизация выглядит так:

 {
    path: 'negozio/:negozio',
    component: NegozioComponent,
    children: [
      {
        path: '',
        component: ModuliComponent,
      },
      {
        path: 'location',
        component: LocationComponent
      },
      {
        path: ':type',
        component: ProductsComponent, // products list is here
      },
      {
        path: 'item/:id',
        component: ItemComponent, // here i should show item details
      },
    ],
  },
  

И вот мой сервис, который возвращает элементы из API

 @Injectable({
  providedIn: 'root'
})
export class PluService {
  constructor(private http: HttpClient, private adapter: PluAdapter) { }

  plu(idNegozio: number, piva: string, lang: string): Observable<Plu[]>{
    return this.http
    .get(`${Globals.API_URL}/plu/${piva}/${idNegozio}`, {params: { lang }})
    .pipe(map((data: any[]) => data.map(item => this.adapter.adapt(item))));
  }
}
  

Ответ №1:

На странице сведений о продукте вам необходимо получить идентификатор продукта из параметра URL (у вас уже есть идентификатор продукта в параметре URL path path: 'item/:id' ).

И сделайте новый запрос GET для извлечения одного продукта, это единственный правильный способ добиться этого, вы не можете передать весь объект product целиком.

В вашем сервисе добавьте новый метод, который возвращает один продукт.

 pluDetails(idNegozio: number, piva: string, lang: string, id: number): Observable<Plu[]>{
 return this.http
.get(`${Globals.API_URL}/plu/${piva}/${idNegozio}/${id}`, {params: { lang }})
...
}
  

На странице сведений о товаре / продукте получите параметр id из URL и выполните новый вызов.

 constructor(private route: ActivatedRoute, private: service: PluService) {
  this.productId = this.route.snapshot.params['id'];
}

productDetails() {
 const productDetails =  this.service.pluDetails(idNegozio, piva, this.productId)
}