Angular 7: обнаружение асинхронного валидатора

Почему бы не сделать это?

def filt_spec(df, col, val, op):
    import operator
    ops = {'eq': operator.eq, 'neq': operator.ne, 'gt': operator.gt, 'ge': operator.ge, 'lt': operator.lt, 'le': operator.le}
    return df[ops[op](df[col], val)]
pandas.DataFrame.filt_spec = filt_spec

Демонстрация:

df = pd.DataFrame({'a': [1,2,3,4,5], 'b':[5,4,3,2,1]})
df.filt_spec('a', 2, 'ge')

Результат:

   a  b
 1  2  4
 2  3  3
 3  4  2
 4  5  1

Вы можете видеть, что столбец 'a' был отфильтрован, где a> = 2.

Это немного быстрее (время ввода, а не производительность), чем цепочка операторов. Конечно, вы могли бы поставить импорт в верхнюю часть файла.

1
задан Stéphane 11 March 2019 в 14:20
поделиться

2 ответа

В качестве обходного пути (я все еще не уверен, что это лучший способ сделать это, потому что в примерах кода это не нужно ...), я добавил ручное обнаружение изменений в конце моей функции валидатора:

  private _studentEmailValidator(): AsyncValidatorFn {
return (control: FormGroup): Observable<{ [key: string]: any } | null> => {
  const email = control.value;
  return this._adminFacade.checkStudentWithEmailExists(email).pipe(
    take(1),
    map(exists => exists ? {'emailAlreadyUserByStudent': {value: email}} : null),
    catchError(() => null),
    tap(() => setTimeout(() => this._checkDetectorRef.detectChanges(), 0))
  );
}

};

0
ответ дан Stéphane 11 March 2019 в 14:20
поделиться

Попробуйте сделать это:

import { ChangeDetectorRef } from '@angular/core';

constructor(
  changeDetectorRef: ChangeDetectorRef
) {
  //call this when you receive the backend response
  changeDetectorRef.markForCheck();
}
0
ответ дан Leandro Lima 11 March 2019 в 14:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: