javascript - AngularJS ngSubmit 仅脏字段

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

最佳答案

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

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

原因如下:

  • $scope.$watch 的监听器函数不够灵活,无法轻松用于创建 $scope.updates object 对象。

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

如果您使用 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
    });
<小时/>

关于javascript - AngularJS ngSubmit 仅脏字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31669275/

相关文章:

angular - 显示数据库获取的值(如果存在)否则在 ng-select angular 中显示默认文本

javascript - Autofocus 在 Firefox 上不起作用,在来自另一个页面时不起作用

javascript - Jquery 是否有任何内置方法可以单独查找可验证元素?

javascript - Angular bootstrap datepicker 开始日期函数

angularjs - 在 <pre> 标签内重复 ng 信息的最佳方法

javascript - $http GET 未在 AngularJS 中显示

javascript - 如何将 javascript 转换为 jquery + 在 Wordpress 中使用它

javascript - 在哪里做这个?

javascript - 如何在传单 map 上绘制标记

javascript - 根据用户在 UI 中输入的数字创建动态数组(绑定(bind)到网格)