2016-12-14 3 views
0

Моя форма заполняется user.email. Я хочу включить только кнопку редактирования, если пользователь заполняет поле FormControl значением, отличным от оригинала user.email. Можно ли это сделать с помощью специального валидатора?Angular 2 - Подтвердить, что значение формы изменилось со своего значения по умолчанию с помощью настраиваемых валидаторов

Это мой валидатор:

import { FormControl } from '@angular/forms'; 

export class ChangedValidator { 
    static isValid(control: FormControl): any { 
    let initialValue = (' ' + control.value).slice(1); 

    if(initialValue === control.value){ 
      return { 
       "changed": true 
      }; 
     } 
     return null; 
    } 
} 

Намерение клонировать FormControl.value, но я понимаю, что этот класс конкретизируется каждый раз, когда значение изменяется в FormControl.

Один очень Hacky подход, который пишет unreusable код является извлечение user.email из данных provider, что хранит его, и использовать его, чтобы сравнить его с FormControl.value. Как вы можете догадаться, валидатор будет ТОЛЬКО работать для параметров объекта User, и ничего больше.

Я хочу написать универсальный Validator, который проверяет, отличается ли текущее значение формы от значения, которое было инициализировано.

Edit:

Это способ сделать это с pristine, но она не совершенна.

import { FormControl } from '@angular/forms'; 

export class ChangedValidator { 
    static isValid(control: FormControl): any { 

    if(control.pristine){ 
      return { 
       "unchanged": true 
      }; 
     } 
     return null; 
    } 
} 
+0

Если 'pristine' не достаточно хорошо (чеки, если значение изменилось, не изменилось, если она и вернулась к оригиналу), то да, вы могли бы сделать пользовательский валидатор, где вы отправьте начальное значение в качестве параметра. – silentsod

+0

@silentsod 'pristine', вероятно,« достаточно хорош », но если возможно, вы можете показать мне, как отправить его? Я посмотрел на другую нить, но ни один из этих решений не работал для меня, когда я это пробовал. –

ответ

1

Если вам нужно проверить, что вещи изменились с начального значения, а не только на то, что элемент управления больше не является первозданным; как, он может вернуться к своему первоначальному значению, и вы не хотите, чтобы сообщение об ошибке, то вы можете реализовать функцию проверки следующим образом:

static isValid = (initialValue: any): any => { 
    return(control: FormControl) => { 
    console.log(control.value); 

    if(JSON.stringify(initialValue) !== JSON.stringify(control.value)) { 
     return { 
       "changed": true 
      }; 
    } 
    return null; 
    } 
} 

Обратите внимание, что является quick and dirty object check и что там уже был ответ на custom validators with parameters и объяснение custom validation as a function factory, но это немного тонко на деталях.

Запрещенная фабрика Namevalidator возвращает сконфигурированный валидатор . Эта функция принимает объект управления Angular и возвращает либо null, если значение управления является допустимым, либо ошибка проверки . Объект ошибки проверки обычно имеет свойство, имя - это ключ проверки ('forbiddenName') и значение которого является произвольным словарем значений, которые мы могли бы вставить в сообщение об ошибке ({name}).

Вот playground

Смежные вопросы