1

我正在使用角度资源尝试使用角度 $save 函数。

默认情况下 $save 将模型发送回服务 URL。但是,它看起来希望模型返回到服务(如果我不这样做,我的模型是空的)。我想知道向控制器返回消息和错误的最佳方式是什么。

我的解决方案是在我的 PHP 中创建一个新类,该类有一个错误数组,用于存储处理过程中遇到的任何错误,以及一个存储模型以供返回的字段。然后在回调函数中发回并处理:

$scope.ApplyChanges=function(){
   console.log("saving...");
    $scope.user.$save(function(data){
      console.log(data);
      if (data.errors.length>0){
         for (error in data.errors){
            $scope.alerts.push({type:'danger', msg: data.errors[error].msg});
         }
         $scope.user=User.get({id:data.data.UserName});
      } else {
         $scope.user=User.get({id:data.data.UserName});
         $scope.alerts.push({type:'success', msg: "User data saved successfully"});
      }
    }, function(err){
         $scope.alerts.push({type:'danger', msg: "There was a problem saving your data: " + err});
    });

这些行在这里:$scope.user=User.get({id:data.data.UserName});我必须使用,因为如果我只是将我的分配$scope.userdata.data,用户不再使用该服务,当我ApplyChanges再次尝试时我会得到一个错误。

那么,有没有办法更无缝地做到这一点?因为它是我必须打一个额外的电话来获取模型。我是否应该仅在出现错误时才发送错误,然后再通过额外的回调来获取模型?有没有更好的办法?

4

1 回答 1

2

首先,您的服务器应该返回带有相关HTTP 错误状态代码的错误(参见 4xx 和 5xx 代码)。这样,您只处理错误回调中的错误:

function onError (response){
    switch (response.status) {
    case 400:
    case 404:
    //etc... 
        response.data.errors.forEach(function(error){
            $scope.alerts.push({type:'danger', msg: error.msg});
        });
        break;
    case 500:
        $scope.alerts.push({type:'danger', msg: "There was a problem saving your data: " + response.data});
        break;
    }
}

也就是说,如果 $scope.user 是一个$resource 实例,那么您不必再次从服务器获取它, $save() 方法不会更改对象。

要将从服务器检索到的“用户”对象中的值复制到 $scope.user 中,只需使用angular.extend()

angular.extend($scope.user, data) //this updates $scope.user with data attributes.

值得注意的是angular.extend不执行深拷贝,如果需要,使用jQuery.extend

jQuery.extend(true, $scope.user, data)
于 2013-11-07T16:12:55.603 回答