我在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模型fill方法无论如何都不会看到该字段并且不会将其设置为空用于验证的值,但采用模型的原始值。

问题是:如何从ngModel发送空字符串而不是未定义?

ps。如果输入类型为Textarea,则$ resource发送空的“”字符串:-/,所以我感到困惑...

最佳答案

当在输入上具有“ required”指令时,将永远不会设置空值(因此它将是未定义的)。

请参见源代码(input.js文件中的“ requiredDirective”),当输入为空时,在该模型中未检索任何值来存储在模型中:

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


恕我直言,这仍然是一个有点奇怪的用例:您确实要进行客户端验证,但仍想向服务器提交无效值,对吗?

我想您可以编写自己的验证(“我需要”)来执行此操作。

或者,您可以在将数据发布到服务器之前复制默认值,例如使用lodash(或下划线):

_.defaults(formData,{名称:“”});

10-02 12:37
查看更多