我在Angular(1.2)和Laravel(4.2)中有简单的crud应用程序。对于简单的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模型填充方法无论如何都看不到该字段并且不要#39; t设置验证的空值,但是取模型的原始值。
问题是:如何从ngModel而不是undefined发送空字符串?
P.S。如果输入类型是Textarea,则$ resource发送空白&#34;&#34;字符串: - /,所以我很困惑......
答案 0 :(得分:18)
您可以配置角度以设置模型,即使该值对allowInvalid
的属性ngModelOptions
无效也是如此。
allowInvalid
:布尔值,表示可以使用未正确验证的值设置模型,而不是将模型设置为未定义的默认行为。
示例:
<input
type="text"
ng-model="myvalue"
ng-model-options="{ allowInvalid: true }"/>
答案 1 :(得分:17)
当您拥有&#34; required&#34;对输入的指令,永远不会设置空值(因此它将是未定义的)。
请参阅源代码(&#34; requiredDirective&#34;在input.js文件中),当输入为空时,没有检索到要存储在模型中的值:
if (attr.required && ctrl.$isEmpty(value)) {
ctrl.$setValidity('required', false);
return;
} else {
ctrl.$setValidity('required', true);
return value;
}
恕我直言,这是一个有点奇怪的用例:您确实需要客户端验证,但仍想向服务器提交无效值,对吗?
我猜你可以编写自己的验证(&#34; my-required&#34;)来做到这一点。
或者,您可以在将数据发布到服务器之前复制默认值,例如使用lodash(或下划线):
_。默认值(formData,{name:&#34;&#34;});