2015-07-28 38 views
0

我想知道是否有提交表单的方法只有$dirty字段,目前我使用ng-change手动将每个字段添加到请求变更。但问题是,它不是很可重用。AngularJS ng仅提交脏字段

在form.html

<input name="status" id="status" ng-model="campaign.status" ng-change="change('status')"> 

在controller.js

$scope.updates = {}; 
$scope.change = function (field) { 
    $scope.updates[field] = $scope.campaign[field]; 
}; 
Campaign.update({id: $scope.campaign.id}, $scope.updates).$promise.then(function() { 
    // success 
}, function() { 
    //error 
}); 

我正在寻找一个更好的方式来做到这一点,也许例如没有updates变量。

+0

能输入为空或不? –

回答

2

在我看来,你只是想发送已更新的领域。我不太确定这是什么原因,但如果你想解决的问题只是提交更改的值,我想建议一种替代方法。

如果你可以使用库如lodash或下划线,我的建议是在提交前做一个原始副本和当前实例$scope.campaigns

的原因如下:

  • $scope.$watch的监听功能不够灵活方便地使用它来创建你的$scope.updates对象的对象。

  • 因为$dirty属性要求您使用的表单字段中,ng-model属性的不是名称的name属性窗体的$dirty状态会有点脆弱。这可能会导致命名冲突,并且往往不够便携或更新友好。

如果您正在使用lodash你可以这样做:

//as soon as you create $scope.campaign, copy it to $scope.original 
$scope.original = angular.copy($scope.campaign); 

//in your update function 
$scope.updates = _.pick($scope.campaign, function(value, key, object){ return $scope.campaign[key] != $scope.original[key] }); 

Campaign.update({id: $scope.campaign.id}, $scope.updates).$promise.then(function() { 
     // success 
    }, function() { 
     //error 
    }); 

+0

在使用_.difference()的情况下,请注意,将它与包含多次具有相同值的对象的列表一起使用,并且您将该值更改为匹配对象之间的不同值共享时,它将不会返回该结果。例如:_difference([{a:1},{a:1},{a:2}],[{a:2},{a:1},{a:2}])会返回一个空数组。 – Matt

1

对于表单中的每个字段,其上有一个属性$dirty。提交表单时,您可以遍历字段并选择$dirty

尝试console.log($scope.formName.status)检查这些属性。

+0

我收到'undefined' for'scope.formName.status',但窗体被标记为脏。 – sakovias

0

您也可以无效,直到每一个领域是肮脏:

JSFiddle

<form name="test"> 
    <input name="status" id="status" ng-model="campaign.status" ng-change="change('status')"> 
    <button type="submit" ng-disabled="!test.status.$dirty">Send</button> 
</form>