ค้นหาเว็บไซต์

javascript - วิธีการกรองเนื้อหาด้วยการพิมพ์ตัวเลขเองและกรองโดยใช้ angular2


ฉันมีทั้งหมด 4 ช่องเพื่อกรองเนื้อหาของตาราง หากฉันใส่ค่า 2 ค่าในส่วนกรอง มันจะทำงาน แต่หากฉันเพิ่มอีกหนึ่งช่องในนั้น จะไม่มีอันไหนทำงานเลย มีใครช่วยฉันกรองเนื้อหาโดยอิงจากอีเมลและหมายเลขโทรศัพท์ได้บ้าง

HTML: ส่วนบนของโค้ดสำหรับการใช้ตัวกรองข้อมูล:

<ng-select [options]="name" [(ngModel)]="filter.name"></ng-select>
      <ng-select [options]="email" [(ngModel)]="filter.email"></ng-select>
      <input type="number" onKeyPress="if(this.value.length==10) return false;" class="form-textbox input-text" [(ngModel)]="filter.phone_number">
      <ng-select [options]="pinAddress" [(ngModel)]="filter.address"></ng-select>

ท่อที่ใช้กรองตาราง:

<tbody>
          <tr *ngFor="let pin of pins | pinfilter:filter">
            <td>{{pin.name}}</td>
            <td>{{pin.description}}</td>
            <td>{{pin.address}}</td>
            <td>{{pin.website}}</td>
            <td>{{pin.phone_number}}</td>
            <td>{{pin.email}}</td>
            <td>{{pin.comments}}</td>
          </tr>
        </tbody>

TS :

filter.pipe.ts:
/* Tutorial filter to write filter functions for Tutorial*/
import { Pipe, PipeTransform } from '@angular/core';

export class NewPin { 
  public _id:number;
  public user_id:number;
  public name:string;  
  public address:string;
  public phone_number:string;
  public email:string;
  public comments:boolean;
}

@Pipe({
  name: 'pinfilter',
  pure: false
})

export class PinPipe implements PipeTransform { 
  transform(items: NewPin[], filter: NewPin): NewPin[] { 
    if (!items || (!filter.name && !filter.address)) { 
      return items; 
    } 
      return items.filter((item: NewPin) => this.applyFilter(item, filter)); 
  } 

  applyFilter(user: NewPin, filter: NewPin): boolean {
    console.log(filter);
    if (filter.name && filter.address) { 
      if (filter.name == user.name && filter.address == user.address) { 
        return true 
      } else { 
        return false 
      } 
    } else if (filter.name) { 
        if (filter.name == user.name) { 
          return true 
    } else { 
        return false 
      }  
    } else if (filter.address) { 
      if (filter.address == user.address) { 
        return true 
      } else { 
        return false 
      } 
    } else { 
      return true 
    } 
  } 
}

component.ts:

public filter: NewPin = new NewPin();

คำตอบ #1

คุณจำเป็นต้องเปลี่ยนฟังก์ชัน applyFilter ของคุณเพื่อให้มันตรวจสอบคุณสมบัติของตัวกรองทั้งหมดกับข้อมูลที่ถูกกรอง

ฉันยังขอแนะนำให้ทำให้โครงสร้างง่ายขึ้นเล็กน้อย อย่างเช่นนี้:

  applyFilter(user: NewPin, filter: NewPin): boolean {
    console.log(filter);
    // check all the filters
    if (filter.name && filter.name != user.name) { 
        return false; 
    } 
    if (filter.address && filter.address != user.address) { 
        return false 
    }  
    if (filter.email && filter.email != user.email) { 
        return false; 
    }  
    if (filter.phone_number && filter.phone_number != user.phone_number) { 
        return false;
    }  
    // if the user passes all the filters, show it
    return true; 
  }