Как использовать параметр 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 ответа:
Прежде всего:
Инкапсулируем эту логику фильтра в класс обслуживания:
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>