Как использовать метод ввода в элементе формы цикла ngFor - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь добавить входное значение к элементу *ngFor. используя ngFor, я генерирую таблицу td, к которой добавлена ​​реактивная форма.

вот мой html:

<td *ngFor="let col of columns;" [ngClass]="col.class" data-testid="form-create-td">
<ng-container *ngIf="col.data !== ''">
   <input data-testid="form-create-name-field" id="name" type="text"
      class="form-control"
      formControlName={{col.data}}
      placeholder={{col.placeholder}}>
   <control-messages [control]="createForm.controls[col.data]"></control-messages>
</ng-container>
<ng-container *ngIf="col.data === ''">
   <button type="submit" aria-label="Ok" data-testid="form-create-btn" class="apply-item" style="border: 1px solid red"></button>
   <button type="button" aria-label="Cancel" (click)="confirmCancel(); false" class="cancel-apply"></button>
</ng-container>
</td>

из приведенного выше html, я выбираю первый td (data-testid="form-create-td[0]), и это 1-й ребенок (form-create-name-field[0]), и я пытаюсь добавить значение к нему следующим образом:

expect(component.getAllByTestId('form-create-name-field')).toBeTruthy(); //works
const td = component.getAllByTestId('form-create-td')[0]; //works
component.fixture.detectChanges();

и пытаюсь добавить значение, например: td.children [0]- здесь есть элемент ввода

component.input(td.children[0], {
        target: {
            value: 'New name'
        }
    });

, но не работает.

Я устанавливаю formControlName из ngFor. Но я не могу его установить. если я утешу td.children[0] - получим следующие значения:

HTMLUnknownElement {
        control: FormControl {
          validator: [Function],
          asyncValidator: null,
          _onCollectionChange: [Function],
          pristine: true,
          touched: false,
          _onDisabledChange: [ [Function] ],
          _onChange: [ [Function] ],
          _pendingValue: null,
          value: null,
          _updateOn: 'blur',
          status: 'INVALID',
          errors: { 'subsytem.required': true },
          valueChanges: EventEmitter {
            _isScalar: false,
            observers: [],
            closed: false,
            isStopped: false,
            hasError: false,
            thrownError: null,
            __isAsync: false
          },
          statusChanges: EventEmitter {
            _isScalar: false,
            observers: [],
            closed: false,
            isStopped: false,
            hasError: false,
            thrownError: null,
            __isAsync: false
          },
          _parent: FormGroup {
            validator: null,
            asyncValidator: null,
            _onCollectionChange: [Function],
            pristine: true,
            touched: false,
            _onDisabledChange: [],
            controls: [Object],
            valueChanges: [EventEmitter],
            statusChanges: [EventEmitter],
            status: 'INVALID',
            value: [Object],
            errors: null
          },
          _pendingDirty: false,
          _pendingTouched: false,
          _pendingChange: false
        }
      }

как правильно установить значение для элемента ввода здесь?

ОБНОВЛЕНИЕ

когда у меня есть поле формы с объектом validators, я не могу установить значение. Например, я не могу добавить значение в следующем:

'Name': new FormControl('', { validators: [ValidationService.required, ValidationService.SubsystemMxLenght, ValidationService.SubsystemPatternMatch], updateOn: 'blur' }),
            'UpdatedByName': new FormControl({ value: this.appUserName, disabled: true }, []),

, если я удаляю объект проверки и обновляю так:

'Name': new FormControl('', ),

работает нормально.

1 Ответ

1 голос
/ 08 ноября 2019

Вы пытались выбрать поля ввода вместо td s?

component.input(component.getAllByTestId('form-create-name-field')[0], {
        target: {
            value: 'New name'
        }
    });

Другой способ - создать тестовые идентификаторы с индексом, чтобы вы могли сделать

component.input(component.getByTestId('form-create-name-field-1'), {
        target: {
            value: 'New name'
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...