Как использовать параметр route в качестве аргумента для метода сервиса?


Я пытаюсь получить сведения о продукте для маршрута одного продукта. пока У меня есть маршрут для одного продукта с параметром id, и он работает нормально

{ path: 'single-product/:id', component: SingleProductComponent }

И в компонент машинопись :

 id: string;
 private mainSub: any;
 public ngOnInit(): void {
  this.mainSub = this.route.params.subscribe(params => {
     this.id = params['id'];
  }
   this.productsService
    .all()
    .map(res => res.filter(item => item.id === this.id))
    .subscribe(resp => console.log(resp));      
 });
 }

В консоли я получил правильный продукт, но как я могу получить данные в представление ?

2 2

2 ответа:

Прежде всего:

Инкапсулируем эту логику фильтра в класс обслуживания:

export interface Product {
 // define the properties for your product
}

@Inject()
export class ProductService {
 ....
 // constructor injetction and other methods
 ....

 all(): Observable<Product[]>{
   // implementation
 }

 getById(id:string): Observable<Product> {
   // or maybe could your backend offer an endpoint that does this for you?
   // something like `root/api/products/:id`;
   return this.all().map(products => products.find(product => product.id === id));
 }
}

Теперь мы можем вернуться к компоненту:

import 'rxjs/add/operator/switchMap'; // Maybe replace with lettable operators

@Component({...})
export class FooComponent {
 product$: Observable<Product>;
 constructor(private _route: ActivatedRoute, private _productService: ProductService){
    this.product$ = _route.paramMap
       .map(params => params.get('id')) // maps the route params. map to the id key
       .switchMap(id => _productService.getById(id));// change the main stream to the stream returned by the service
 }
}

Теперь в вашем шаблоне вы можете использовать небольшой трюк для доступа к последнему значению в потоке product$:

<ng-container *ngIf="product$ | async as product">
   {{ product | json }}
   // your template goes here
</ng-container>

Используйте следующий код для реализации в вашем компоненте:

 id: string;
 product: any;
 private mainSub: any;
 public ngOnInit(): void {
  this.mainSub = this.route.params.subscribe(params => {
     // I used + sign if id is number otherwise remove it
     this.id = +params['id'];
     this.productsService
      .all()
      .map(res => res.find(item => item.id === this.id))
      .subscribe(resp => this.product = resp);      
    });
  }
 }

Теперь используйте свои данные в шаблоне html следующим образом (фиктивный html):

<table>
  <tr>
    <td>Product Name</td>
    <td>{{product.productName}}</td>
  </tr>
</table>