AngularJS仅提交脏字段

时间:2015-07-28 06:53:49

标签: javascript angularjs

我想知道是否有办法提交仅包含$dirty字段的表单,目前我正在使用ng-change在更改时手动将每个字段添加到请求中。但问题是,它不是非常可重复使用。

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变量。

3 个答案:

答案 0 :(得分:2)

在我看来,您只想发送已更新的字段。我不太清楚这是什么原因,但如果你想要解决的问题只是提交更改的值,我想建议另一种方法。

如果您可以使用像lodash或下划线这样的库,我的建议是在提交之前对原始副本和$scope.campaigns的当前实例进行差异化。

原因如下:

  • $scope.$watch的侦听器功能不够灵活,无法轻松用于创建$scope.updates对象对象。

  • 表单的$dirty状态会有点脆弱,因为$dirty属性要求您使用表单字段的name属性,而不是{{1}的名称}属性。这可能会导致命名冲突,并且往往不是非常便携或更新友好。

如果您使用的是lodash,您可能会执行以下操作:

ng-model

答案 1 :(得分:1)

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

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

答案 2 :(得分: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>