代码之家  ›  专栏  ›  技术社区  ›  ufk

如何正确使用mat autocomplete和远程graphQL数据?

  •  0
  • ufk  · 技术社区  · 6 年前

    我使用angular 6和angular material,我试图构建一个搜索组件,使用Apollo的graphQL。

    好吧,组件可以工作,但我想解决这些问题:

    1. 我想加上脱胶时间,但我找不到确切的位置。

    与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 组成部分:

    <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 回复  |  直到 6 年前
        1
  •  2
  •   itaintme    6 年前

    我想加上脱胶时间,但我找不到确切的位置。

    1 ]订阅价值更新的地方。你的 ngOnInit 看起来像这样

    ngOnInit() {
    this.productCtrl.valueChanges
      .pipe(
        debounceTime(500),
        distinctUntilChanged()
      )
      .subscribe(v => {
      ...
    

    别忘了 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 有一个管道的工作演示。