Почему 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 }"/>