Правильный способ использования функции службы ресурсов Angular $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.user на data.data, пользователь больше не использовал службу, и я получил бы сообщение об ошибке, когда я попытался бы снова ApplyChanges.

Итак, есть ли способ сделать это более безобидно? Так как я должен сделать дополнительный звонок, чтобы получить модель. Должен ли я отправлять ошибку, только если есть ошибка, а затем иметь дополнительный обратный вызов для получения модели? Есть ли способ лучше?


person Snowburnt    schedule 07.11.2013    source источник
comment
Хотите объяснить отрицательное голосование?   -  person Snowburnt    schedule 07.11.2013


Ответы (1)


Прежде всего, ваш сервер должен возвращать ошибки с соответствующими кодами состояния ошибок 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. расширить()

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

Стоит отметить, что angular.extend не выполняет глубокое копирование, при необходимости используйте jQuery.extend:

jQuery.extend(true, $scope.user, data)
person rvignacio    schedule 07.11.2013
comment
Может быть, мне следует быть более конкретным, если была ошибка пользовательского ввода, и моя проверка на стороне сервера по той или иной причине отбрасывала ее, поэтому вызов был успешным, а пользователь - нет. - person Snowburnt; 07.11.2013
comment
Кроме того, я заметил, что если я не возвращаю объект в функцию сохранения, модель очищается. - person Snowburnt; 07.11.2013
comment
Если проверка на стороне сервера не удалась, сервер должен ответить 422 Unprocessable Entity или 409 Conflict или соответствующий код состояния с данными об ошибке в полезной нагрузке. - person rvignacio; 07.11.2013
comment
Какую версию углового вы используете? Я использовал $resource в 1.2.0-rc3, и это не меняет модель. Если вам нужно скопировать значения из пользовательского объекта, полученного с сервера, в $scope.user, вы можете использовать angular.extend angular.extend($scope.user, data.data) - person rvignacio; 07.11.2013
comment
Я использую 1.2.0-rc3. Немного не связанно, но да, каждый раз, когда вызывается $save, мой ресурс очищается. Попробую расширение. Моя цель — отправить подробное сообщение о том, что не удалось, хотя ошибка 422 имеет смысл, потому что они попытаются со мной пообщаться, обходя мой API. - person Snowburnt; 07.11.2013