2

カスタムパイプを使用して正常にフィルタリングしたテーブルがあります。フィルタは、一緒にフォームである 2 つの入力に基づいています。追加したい機能は、送信ボタンがクリックされるまでフィルタリングが行われないようにすることです。つまり、検索ボタンのようなものです。パイプに関する多くの情報を見つけましたが、ボタンのクリック時にパイプをアクティブにすることについては何もありません。

mainpage.component.html:

<div>
  <label>Start Date:</label>
  <input type="text" [(ngModel)]="startDateValue">
</div>
  <label>End Date:</label>
  <input type="text" [(ngModel)]="endDateValue">
</div>
//'let idx=index' and 'let even=even' are used to change color of the rows but I took out that code. The 'onClick' function just takes the row and uses an EventEmitter to output it.
<tr *ngFor="let dPoint of theData | searchDates:startDateValue:endDateValue; let idx=index; let even=even;" (click)="onClick(dPoint, idx)">
  <td>{{dPoint.tDataPoint}}</td>
  <td>{{dPoint.tICCP}}</td>
  <td>{{dPoint.tStartDate}}</td>
  <td>{{dPoint.tEndDate}}</td>
</tr>
//the button that will execute the filtering
<button type="submit" class="btn icon-search" [disabled]="!secondForm.valid" (click)="submit(secondForm.value)"></button>

mainpage.component.ts:

@Component({
  selector: 'main-page',
  styleUrls: ['../app.component.css'],
  templateUrl: 'mainpage.component.html',
  providers: [DataTableService, DatePipe]
})

export class MainPageComponent implements OnInit {
  secondForm : FormGroup;
  theData:DataTable[] = [];

  constructor(fb: FormBuilder, private datePipe: DatePipe, private dataService: DataTableService, private cdRef:ChangeDetectorRef){
    this.secondForm = fb.group({
      'startDate' : [null, Validators.required],
      'endDate' : [null, Validators.required]
    }, {validator: this.endDateAfterOrEqualValidator})
  }

  getTable(): void {
    this.dataService.getTable().then(theData => this.theData = theData);
    this.cdRef.detectChanges();
  }

  submit(value: any){
      //where I'd want to trigger the filtering/pipe
  }
}

検索パイプ.ts:

import { Pipe, PipeTransform } from "@angular/core";

@Pipe({
  name: "searchDates"
})

export class SearchPipe implements PipeTransform {
  transform(value, minDate , maxDate){
    return value.filter(row => {
      return row.tStartDate >= minDate && row.tEndDate <= maxDate;
    });
  }
}
4

2 に答える 2

5

ユーザーがボタンをクリックしたときに、パイプを削除し、代わりに自分でデータをフィルタリングすることを検討できます。

最初に、フィルタリングされた結果を表す 2 番目のプロパティを定義します。

let theFilteredData: DataTable[]

バインディングを変更して、代わりに theFilteredData にバインドします。

*ngFor="let dPoint of theFilteredData;" //rest of *ngFor not included

送信機能で:

this.theFilteredData = this.theData.filter(row => 
      return row.tStartDate >= minDate && row.tEndDate <= maxDate);
于 2016-12-29T20:17:50.860 に答える
0

送信をクリックすると切り替えられるブール値を使用して、フィルター処理された for ループを切り替えることができます。

*.html:

<div>
    <label>Start Date:</label>
      <input type="text" [(ngModel)]="startDateValue">
    </div>
    <label>End Date:</label>
      <input type="text" [(ngModel)]="endDateValue">
    </div>
    <tr *ngIf="filterToggle" *ngFor="let dPoint of theData | searchDates:startDateValue:endDateValue; let idx=index; let even=even;" (click)="onClick(dPoint, idx)">
      <td>{{dPoint.tDataPoint}}</td>
      <td>{{dPoint.tICCP}}</td>
      <td>{{dPoint.tStartDate}}</td>
      <td>{{dPoint.tEndDate}}</td>
    </tr>
    <tr *ngIf="!filterToggle" *ngFor="let dPoint of theData; let idx=index; let even=even;" (click)="onClick(dPoint, idx)">
      <td>{{dPoint.tDataPoint}}</td>
      <td>{{dPoint.tICCP}}</td>
      <td>{{dPoint.tStartDate}}</td>
      <td>{{dPoint.tEndDate}}</td>
    </tr>
    //the button that will execute the filtering
    <button type="submit" class="btn icon-search" [disabled]="!secondForm.valid" (click)="submit()"></button>
</div>

*.ts:

submit() {
  this.filterToggle = !this.filterToggle;
}

テンプレート コードを保持しませんが、動作するはずです。

別のアイデアは、ブール値の「filterToggle」もパイプを介して送信することです。これにより、「filterToggle」が true でない限り、パイプ自体はフィルタリングされません。したがって、送信をクリックすると、トグルが true に変わり、パイプがフィルタリングされます。

*ngFor は次のようになります。

<tr *ngFor="let dPoint of theData | searchDates:startDateValue:endDate:filterToggle; let idx = index; let even=even">
  ...
</tr>

または、実際のデータをパイプに通すのではなく、単にフィルター処理することもできます。

submit(){
  this.theData = this.theData.filter(data => 
    return data.tStartDate >= this.startDateValue && data.tEndDate <= this.endDateValue);
}

したがって、送信をクリックすると、元の theData 配列をフィルタリングして変更します。何をフィルタリングするかを決定するブール式をいじる必要があるかもしれません。開始日が「this.startDateValue」以上で「this.endDateValue」以下の「データ」のみを保持する必要があります。ただし、これは元の theData 配列を上書きします。したがって、一時的な配列を作成して、フィルター処理されていない theData に戻すことができます。

于 2016-12-29T20:14:00.010 に答える