为什么角度设置未定义为清空ng-model字段

时间:2014-10-01 09:26:03

标签: angularjs laravel angular-resource

我在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;字符串: - /,所以我很困惑......

2 个答案:

答案 0 :(得分:18)

您可以配置角度以设置模型,即使该值对allowInvalid的属性ngModelOptions无效也是如此。

  

allowInvalid:布尔值,表示可以使用未正确验证的值设置模型,而不是将模型设置为未定义的默认行为。

API Reference

示例:

<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;});