Angular 6 ngModel reset
Здравствуйте! Подскажите как правильно сбросить value в input на изначальный.
У меня таблица, с ngFor, там лежит такой элемент: <input type="text" [(ngModel)]="rowData[col.field]" (keypress)="setValue($event)"> в setValue я проверяю значение на валидность.. оно может быть неверное и тогда мне надо вернуть значение input на изначальное. Думал еще прикрутить (ngModelChange), для моей задачи это вроде как тоже самое. Подскажите как действовать? |
CrazyBite,
Просто не используйте 2way data binding. То есть <input type="text" [ngModel]="rowData[col.field]" (keypress)="setValue($event)"> Ну и в setValue если event.target.value не валидно - сбрасывайте его на rowData[col.field], а если валидно - меняйте значение rowData[col.field] на него. |
Цитата:
<ng-template pTemplate="body" let-rowData let-columns="columns"> я не знаю как к ней из фунцкии обратится... |
CrazyBite,
Ну тогда можно модернизировать функцию setValue. <input type="text" [ngModel]="rowData[col.field]" (keypress)="setValue($event, rowData[col.field])"> Передавать объект события и значение на которое нужно скинуть event.target в случае не валидности нового. |
Цитата:
А не подскажите аналогичного алгоритма, только с [(ngModel)] нет? |
CrazyBite,
Можно при событии focus запоминать значение rowData[col.field], а при keypress, если новый value не валиден - сбрасывать на это запомненное значение. |
Цитата:
|
CrazyBite,
<input type="text" [(ngModel)]="rowData[col.field]" (keypress)="setValue($event)" (focus)="previousValue=rowData[col.field]"> |
destus,
получается previousValue это глобальная, и она будет меняться в зависимости от того на кого ты фокусишься. Если мы допустим поменяем значение и не засабмитим его, при этом сменим фокус на другой инпут, мы потеряем previousValue прошлого инпута. Смотрите у меня такая вот бредятина получается: <ng-template pTemplate="body" let-rowData let-columns="columns"> <tr [style.background-color]="(rowData.hasOwnProperty('color')) ? rowData['color'] : 'white'"> <td *ngFor="let col of databaseStructure.columns"> <span *ngIf="!editable">{{rowData[col.field]}}</span> <input type="text" [(ngModel)]="rowData[col.field]" *ngIf="editable" class="editInput" (keypress)="setValue($event,rowData['id'],col.field,rowData[col.field])" (focus)="previousValue=rowData[col.field]" > </td> </tr> </ng-template> Ели editable, то я показываю инпуты. В них инфа если меняется и сабмитится то я проверяю ее на сервере и в зависимости от валидности или применяю ее на клиентской части или возвращаю на предыдущее значение. Так же если мы не поменяли и не засабмитили то тоже надо вернуть на предыдущее значение. |
CrazyBite,
Ну тогда можно создать переменную типа Map, где в качестве ключей хранить ссылки на инпуты, а в качестве значений - начальные данные. При фокусе делать map.set(), если нет такого инупта в наборе (map.has), а при сабмите в цикле восстанавливать значения для не валидных данных. Короче говоря, решений может быть несколько...если был бы еще запускаемый пример всего этого... |
Часовой пояс GMT +3, время: 13:09. |