私は次のクラスを持っています。filterOutEmails関数をarray.some
、現在のコードの代わりに使用するように変換したいと思います。
export class UsertableComponent {
dataSource: MatTableDataSource<TrialUser>;
createTableFromServer = (data: TrialUsers[], emailDomains:string) => {
this.dataSource = new MatTableDataSource(data);
this.dataSource.filterPredicate = this.filterOutEmails
}
filterOutEmails = (row: TrialUser, emailDomains: string): boolean => {
const listofFilters = emailDomains.split(',');
for (let i = 0; i < listofFilters.length; i++){
if (row.email.toLowerCase().includes(listofFilters[i].trim())){
return true;
};
}
return false;
}
}
次のことを試してみましたthis
が、nullでした。矢印関数を使おうとすると、行を渡すことができませんでした。(私は設定しない場合this: TrialUser
は、パラメータとしてタイプUsertableComponentに「これ」に対応し、クラスの機能は、私が渡しているにもかかわらず、であるrow
のsome
でthisObjectなど)
private determineIfRowShouldBeShown(this: TrialUser, domain: string): boolean {
const row: TrialUser = this;
return !row.email.toLowerCase().includes(domain.trim());
}
private filterOutEmails= (row: TrialUser, emailDomains: string): boolean {
const listofFilters = emailDomains.split(',');
return listofFilters.some(this.determineIfRowShouldBeShown, row) ;
}
}
'determineIfRowSHouldBeShown'をインラインファットアロー関数として配置することは機能しますが、関数定義を分離したままにしておきたいと思います。
矢印関数を使用するthis
と、引数として渡された場合でも字句的にバインドされます。
// If you're gonna abuse `this` I wouldn't put the function in a class as it's really confusing for `this` to not be the instance. You also can't use arrow functions in this case as they prevent rebinding the context.
function determineIfRowShouldBeShown(domain: string): boolean {
return !this.email.toLowerCase().includes(domain.trim());
}
export class UsertableComponent {
dataSource: MatTableDataSource<TrialUser>;
createTableFromServer = (data: TrialUsers[], emailDomains:string) => {
this.dataSource = new MatTableDataSource(data);
this.dataSource.filterPredicate = this.filterOutEmails
}
// I don't think this is a good name since it doesn't actually filter anything.
filterOutEmails(row: TrialUser, emailDomains: string): boolean{
return emailDomains.split(',').some(determineIfRowShouldBeShown, row);
}
}
これは、他のいくつかの方法でも実行できます。
関数の手動バインディングの使用:
...
filterOutEmails(row: TrialUser, emailDomains: string){
emailDomains.split(',').some(determineIfRowShouldBeShown.bind(row));
}
カリー化/部分適用の使用(私の好み)
const determineIfRowShouldBeShown = (row: TrialUser) => (domain: string): boolean => !row.email.toLowerCase().includes(domain.trim());
...
filterOutEmails(row: TrialUser, emailDomains: string){
emailDomains.split(',').some(determineIfRowShouldBeShown(row));
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加