Почему angular устанавливает undefined для пустых полей ng-model

У меня есть простое приложение crud в Angular (1.2) и Laravel (4.2). Для простых операций crud я использую эффективный метод Eloquent:

$product->fill(Input::all());

который принимает все поля из запроса полезной нагрузки, но есть ли проблема, когда мне нужно обновить модель с пустыми полями.

В действии редактирования у меня есть форма, заполненная ответом метода $resource get моей службы:

adminModule.factory 'Product', ($resource) ->
  $resource '/admin/products/:id', { id: '@id' }, {
    query: { method: 'GET', isArray: false }
    update: { method: 'PUT' }
  }

контроллер:

adminModule.controller 'ProductFormEditController', ($scope, Product, $stateParams) ->

  $scope.formData = Product.get({id: $stateParams.id})

и html:

    <input  type="text" data-ng-model="formData.name" name="name" class="form-control" id="name"
                           placeholder="Nazwa" data-server-error required>

Если я очищу это значение поля и отправлю значение $scope.formData, будет установлено значение undefined, и в запрос PUT не будет включен, поэтому метод заполнения модели laravel не будет видеть поле в любом случае и не будет 't устанавливает пустое значение для проверки, но принимает исходное значение модели.

Проблема в следующем: как я могу отправить пустую строку из ngModel вместо undefined?

p.s. Если тип ввода - textarea, то $resource посылает пустую строку ":" /, поэтому я запутываю...

Ответ 1

Когда у вас есть "требуемая" директива на входе, пустое значение никогда не будет установлено (поэтому оно будет undefined).

См. исходный код ( "requiredDirective" в файле input.js), где нет значения для сохранения в модели, когда вход пуст:

if (attr.required && ctrl.$isEmpty(value)) {
   ctrl.$setValidity('required', false);
      return;
   } else {
      ctrl.$setValidity('required', true);
      return value;
}

IMHO - это немного странный случай использования: вы действительно хотите проверить на стороне клиента, но все же хотите отправить недопустимые значения на сервер, правильно?

Я думаю, вы можете написать свою собственную проверку ( "мое-обязательное" ) для этого.

В качестве альтернативы вы можете копировать значения по умолчанию перед отправкой данных на сервер, например, с помощью lodash (или подчеркивания):

_. defaults (formData, {name: ""});

Ответ 2

Вы можете настроить angular для установки вашей модели, даже если значение недействительно с свойством allowInvalid от ngModelOptions.

allowInvalid: логическое значение, указывающее, что модель может быть задана со значениями, которые не были корректно проверены, а не по умолчанию для установки модели на undefined.

Ссылка на API: https://docs.angularjs.org/api/ng/directive/ngModelOptions

Пример:

<input 
   type="text" 
   ng-model="myvalue"
   ng-model-options="{ allowInvalid: true }"/>