Javascript-форум (https://javascript.ru/forum/)
-   Angular.js (https://javascript.ru/forum/angular/)
-   -   Как заставить NgModelController поставить свойству модели null (https://javascript.ru/forum/angular/48922-kak-zastavit-ngmodelcontroller-postavit-svojjstvu-modeli-null.html)

Shinoby 22.07.2014 07:25

Как заставить NgModelController поставить свойству модели null
 
Недавно начал разбираться с ангуляром и столкнулся с одной проблемой.

Мне необходимо допилить одну директиву (контрол для формы)
Для очистки значения использую ngModel.$setViewValue(null) при этом в модель записывается undefined. Не могу понять, как сделать так, чтобы
вместо
{
    uname: 'blablabla';
    ugroup: undefined;
}

было
{
    uname: 'blablabla';
    ugroup: null;
}

Пробовал пропускать значение через $parsers и $formatters. Но в итоге все-равно получаю undefined.

Aetae 22.07.2014 07:48

Посмотрите на исходник $setViewValue - что он делает со значением?

Shinoby 22.07.2014 13:18

Цитата:

Сообщение от Aetae (Сообщение 322143)
Посмотрите на исходник $setViewValue - что он делает со значением?

Смотрел я исходники, но пока не понял механизм обновления свойств модели :(

FireVolkhov 22.07.2014 13:34

На элементе input (или там где ng-model) есть атрибут required?

Shinoby 23.07.2014 07:18

FireVolkhov, ага стоял required.

Теперь понял, если на элементе есть required, то в модель пишется undefined. если нет, то null.

Спасибо :)

FireVolkhov 23.07.2014 09:07

Не совсем так, просто в Angular required то же директива.
Вот исходник
var requiredDirective = function() {
  return {
    require: '?ngModel',
    link: function(scope, elm, attr, ctrl) {
      if (!ctrl) return;
      attr.required = true; // force truthy in case we are on non input element

      var validator = function(value) {
        if (attr.required && ctrl.$isEmpty(value)) {
          ctrl.$setValidity('required', false);
          return; // <- Все дело вот в этом
        } else {
          ctrl.$setValidity('required', true);
          return value;
        }
      };

      ctrl.$formatters.push(validator);
      ctrl.$parsers.unshift(validator);

      attr.$observe('required', function() {
        validator(ctrl.$viewValue);
      });
    }
  };
};
И там видно, если не пройти валидацию (a null не проходит), то выполнется
return;
и результат undefined


Часовой пояс GMT +3, время: 01:54.