AngularJS:更新资源的正确方法是什么

时间:2015-01-12 03:16:07

标签: javascript angularjs ngresource

我想知道更新资源的最佳方法是什么。

best 我的意思是最常见的,可测试的,并且关注AngularJS标准。根据您的经验,您更喜欢什么。

以下是我正在考虑的一些案例。

方法1:简单的

var $scope.user = User.get({ id: 123 });
// get this object in a view form, change some stuffs, NOT all of them

$scope.doUpdate = function() {
  $scope.user.$update();
}
  • 优势:非常容易编写
  • 缺点:如果它有很多属性且只有一个被修改,那么所有属性都会被重新发送

方法2:副本

var $scope.user = User.get({ id: 123 });
var $scope.userCopy = angular.copy($scope.user);
// get this object in a view form, change some stuffs, NOT all of them

$scope.doUpdate = function() {
  $scope.userCopy.$update();
}
  • 优点:保护$scope.user var,如果它在视图中的其他位置使用或作为依赖注入;如果需要,也可以将$scope.userCopy还原为$scope.user
  • 缺点:变量重复和$scope.user不会反映变化。

方法3:非常安全的

var user = User.get({ id: 123 });
var $scope.userCopy = angular.copy(user);
// get this object in a view form, change some stuffs, NOT all of them

$scope.doUpdate = function() {
  var userChanged = new User();
  userChanged.id = user.id;
  if ($scope.userCopy.name !== user.name) {
    userChanged.name = $scope.userCopy.name;
  }
  if ($scope.userCopy.surname !== user.surname) {
    userChanged.surname = $scope.userCopy.surname;
  }
  // and iterate on all the values we are expected to be modified
  userChanged.$update();
}
  • 优势:您确切知道更新的内容
  • 缺点:可能意味着大量代码和检查,变量重复,$scope不会反映变化。

1 个答案:

答案 0 :(得分:0)

我使用方法3的变体来进行部分更新,肯定Lo-Dash可以提供帮助,我想确保我只删除了udpated字段,仅此而已。

我定义了一个diff函数,用于选择需要发送到服务器的partial:

var diff = function(newVal, oldVal){
    return _.omit(newVal , function(value, key){
        return angular.equals(oldVal[key] , value);
    });
}

在加载表单之前,我有一份当前模型的副本:

var oldVal = angular.copy($scope.user);

然后实际更新将是这样的:

$scope.doUpdate = function(){
    var userPartial = diff($scope.user , oldVal);
    User.update({id: $scope.user._id} , userPartial);
}

如果用户点击取消按钮,或者在更新过程中出现问题,您可以随时恢复到oldVal。