2014-10-01 88 views
11

我在Angular(1.2)和Laravel(4.2)中有简单的Crud应用程序。为了简单的CRUD操作我用有效的方法口才:为什么angular set将undefined设置为空ng模型字段

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

这需要从请求负载的所有领域,但有一个问题,当我需要做更新模型与空字段。

在编辑动作我有充满了我的服务的$资源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并且有n不包括在PUT请求中,因此laravel模型填充方法不会看到该字段,也不会为验证设置空值,而是取模型的原始值。

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

p.s.如果输入类型是textarea,$ resource发送空的字符串: - /,所以我很困惑...

回答

14

当您对输入有“必需”指令时,将永远不会设置空值所以它将是未定义的)。

参见(在文件input.js“requiredDirective”)的源代码在没有值被检索在模型中,当输入是空白存储:

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

IMHO它是有点奇怪用例无论如何:你确实想要客户端验证,但仍然要提交无效的值到服务器,对不对?

我想你可以写你自己的验证(“我需要”)来做到这一点。

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

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

+0

我需要为输入原因角形式的验证所需要的属性...是的,我没有对窗体标签进行验证,它没有帮助 – 2014-10-02 17:48:28

+0

不幸的是,这只是“角色”中不需要的方法。看到我编辑的答案。 – 2014-10-06 11:53:37

13

即使该值与从ngModelOptions开始的属性allowInvalid无效,也可以配置角度来设置模型。

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

API参考:https://docs.angularjs.org/api/ng/directive/ngModelOptions

实施例:

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

完美 - 我想知道为什么我的模型被设置为'undefined',每当我的验证失败!这解决了这个问题。谢谢! – 2017-12-27 01:30:22

相关问题