Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 19.07.2018, 11:15
Аспирант
Отправить личное сообщение для CrazyBite Посмотреть профиль Найти все сообщения от CrazyBite
 
Регистрация: 18.07.2013
Сообщений: 43

Angular 6 ngModel reset
Здравствуйте! Подскажите как правильно сбросить value в input на изначальный.
У меня таблица, с ngFor, там лежит такой элемент:
<input type="text" [(ngModel)]="rowData[col.field]"  (keypress)="setValue($event)">

в setValue я проверяю значение на валидность.. оно может быть неверное и тогда мне надо вернуть значение input на изначальное.
Думал еще прикрутить (ngModelChange), для моей задачи это вроде как тоже самое.
Подскажите как действовать?
Ответить с цитированием
  #2 (permalink)  
Старый 19.07.2018, 15:08
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

CrazyBite,
Просто не используйте 2way data binding. То есть
<input type="text" [ngModel]="rowData[col.field]"  (keypress)="setValue($event)">

Ну и в setValue если event.target.value не валидно - сбрасывайте его на rowData[col.field], а если валидно - меняйте значение rowData[col.field] на него.
Ответить с цитированием
  #3 (permalink)  
Старый 19.07.2018, 15:37
Аспирант
Отправить личное сообщение для CrazyBite Посмотреть профиль Найти все сообщения от CrazyBite
 
Регистрация: 18.07.2013
Сообщений: 43

Сообщение от destus Посмотреть сообщение
CrazyBite,
Просто не используйте 2way data binding. То есть
<input type="text" [ngModel]="rowData[col.field]"  (keypress)="setValue($event)">

Ну и в setValue если event.target.value не валидно - сбрасывайте его на rowData[col.field], а если валидно - меняйте значение rowData[col.field] на него.
Дело в том что rowData это переменная в темплейте:
<ng-template pTemplate="body" let-rowData let-columns="columns">
я не знаю как к ней из фунцкии обратится...
Ответить с цитированием
  #4 (permalink)  
Старый 19.07.2018, 16:07
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

CrazyBite,
Ну тогда можно модернизировать функцию setValue.
<input type="text" [ngModel]="rowData[col.field]"  (keypress)="setValue($event, rowData[col.field])">

Передавать объект события и значение на которое нужно скинуть event.target в случае не валидности нового.
Ответить с цитированием
  #5 (permalink)  
Старый 20.07.2018, 08:26
Аспирант
Отправить личное сообщение для CrazyBite Посмотреть профиль Найти все сообщения от CrazyBite
 
Регистрация: 18.07.2013
Сообщений: 43

Сообщение от destus Посмотреть сообщение
CrazyBite,
Ну тогда можно модернизировать функцию setValue.
<input type="text" [ngModel]="rowData[col.field]"  (keypress)="setValue($event, rowData[col.field])">

Передавать объект события и значение на которое нужно скинуть event.target в случае не валидности нового.
Спасибо за ответ! Я так и сделаю.
А не подскажите аналогичного алгоритма, только с [(ngModel)] нет?
Ответить с цитированием
  #6 (permalink)  
Старый 20.07.2018, 09:17
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

CrazyBite,
Можно при событии focus запоминать значение rowData[col.field], а при keypress, если новый value не валиден - сбрасывать на это запомненное значение.
Ответить с цитированием
  #7 (permalink)  
Старый 20.07.2018, 09:23
Аспирант
Отправить личное сообщение для CrazyBite Посмотреть профиль Найти все сообщения от CrazyBite
 
Регистрация: 18.07.2013
Сообщений: 43

Сообщение от destus Посмотреть сообщение
CrazyBite,
Можно при событии focus запоминать значение rowData[col.field], а при keypress, если новый value не валиден - сбрасывать на это запомненное значение.
Как запомнить изначальное значение у [(ngModel)] ? Оно (запомненное значение) же вроде будет изменяться в соответствии со значением ngModel, нет?
Ответить с цитированием
  #8 (permalink)  
Старый 20.07.2018, 09:32
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

CrazyBite,
<input type="text" [(ngModel)]="rowData[col.field]"  (keypress)="setValue($event)" (focus)="previousValue=rowData[col.field]">
Ответить с цитированием
  #9 (permalink)  
Старый 20.07.2018, 09:49
Аспирант
Отправить личное сообщение для CrazyBite Посмотреть профиль Найти все сообщения от CrazyBite
 
Регистрация: 18.07.2013
Сообщений: 43

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, то я показываю инпуты. В них инфа если меняется и сабмитится то я проверяю ее на сервере и в зависимости от валидности или применяю ее на клиентской части или возвращаю на предыдущее значение. Так же если мы не поменяли и не засабмитили то тоже надо вернуть на предыдущее значение.
Ответить с цитированием
  #10 (permalink)  
Старый 20.07.2018, 10:04
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

CrazyBite,
Ну тогда можно создать переменную типа Map, где в качестве ключей хранить ссылки на инпуты, а в качестве значений - начальные данные. При фокусе делать map.set(), если нет такого инупта в наборе (map.has), а при сабмите в цикле восстанавливать значения для не валидных данных. Короче говоря, решений может быть несколько...если был бы еще запускаемый пример всего этого...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Angular Universal, серверный рендеринг - нужно ли мне это? yinfo Angular.js 6 29.10.2018 14:17
Преподаватель JavaScript, Angular OxanaAV Работа 3 15.11.2017 08:16
Вакансия: Опытный разработчик Angular / Anguar 2. Москва. AK76 Работа 0 14.08.2017 11:37
Angular task workflow mardoksp Angular.js 0 15.02.2016 21:34
Angular и динамический контент Diem Angular.js 1 26.07.2013 18:57