我使用angular 6和angular material,我试图构建一个搜索组件,使用Apollo的graphQL。
好吧,组件可以工作,但我想解决这些问题:
与graphQL服务器交互的我的产品服务:
import { Injectable } from '@angular/core'; import {Apollo} from 'apollo-angular'; import gql from 'graphql-tag'; @Injectable({ providedIn: 'root' }) export class ProductService { constructor(private apollo: Apollo) { } searchForProduct(productName: string) { return this.apollo.watchQuery<any>({ query: gql`{products_by_p_name_search(lang_id:1,query:"${productName}") {category_id,price,category_name,id,name,desc,quantity,year_manufacture,image_file}}` }); } }
我的搜索组件html与 mat-autocomplete 组成部分:
mat-autocomplete
<form class="example-form"> <mat-form-field class="example-full-width"> <input matInput placeholder="×פש ××צר" aria-label="×פש ××צר" [matAutocomplete]="auto" [formControl]="productCtrl"> <mat-autocomplete #auto="matAutocomplete"> <mat-option *ngFor="let product of products" [value]="product.name"> <img class="example-option-img" aria-hidden src="../../assets/products/{{product.id}}/{{product.imgFile}}_t.jpg" height="25"> <span>{{product.name}}</span> | <small>Population: {{product.population}}</small> </mat-option> </mat-autocomplete> </mat-form-field> </form>
import { Component, OnInit } from '@angular/core'; import {FormControl} from '@angular/forms'; import {Product} from '../product'; import {ProductService} from '../product.service'; @Component({ selector: 'app-search-product', templateUrl: './search-product.component.html', styleUrls: ['./search-product.component.scss'] }) export class SearchProductComponent implements OnInit { productCtrl = new FormControl(); products: Product[] = []; constructor(private productService: ProductService) { } ngOnInit() { this.productCtrl.valueChanges .subscribe(v => { this.productService.searchForProduct(v.toString()).valueChanges.subscribe( ({data}) => { const productsResult: Product[] = []; data.products_by_p_name_search.forEach((productObj) => { const product = new Product(); product.id = productObj.id; product.categoryName = productObj.category_name; product.name = productObj.name; product.desc = productObj.desc; product.quantity = productObj.quantity; product.yearManufacture = productObj.year_manufacture; product.imgFile = productObj.image_file; product.categoryId = productObj.category_id; product.price = productObj.price; productsResult.push(product); }); this.products = productsResult; }); }); } }
我想加上脱胶时间,但我找不到确切的位置。
1 ]订阅价值更新的地方。你的 ngOnInit 看起来像这样
ngOnInit
ngOnInit() { this.productCtrl.valueChanges .pipe( debounceTime(500), distinctUntilChanged() ) .subscribe(v => { ...
别忘了 import {debounceTime} from 'rxjs/operators'; .
import {debounceTime} from 'rxjs/operators';
我希望在graphQL查询中不会搜索空值
filter( value => value.length > 0)
你的 恩戈尼特 现在有点像
恩戈尼特
ngOnInit() { this.productCtrl.valueChanges .pipe( debounceTime(500), distinctUntilChanged(), filter( value => value.length > 0) ) .subscribe(v => { ...
This SO answer 有一个管道的工作演示。