Pregunta

Estoy trabajando con recursos angulares tratando de usar la función Angular $ Save.

Por defecto, $ Save envía el modelo a la URL del servicio. Sin embargo, parece que espera que el modelo se devuelva al servicio (mi modelo está vacío si no hago esto). Me preguntaba cuál es la mejor manera de devolver mensajes y errores al controlador.

Mi solución fue crear una nueva clase en mi PHP que tenga una matriz de errores que almacene cualquier error encontrado en el procesamiento y un campo que almacene el modelo para regresar. Luego se envía y se procesa en la función de devolución de llamada:

$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});
    });

Estas líneas aquí: $scope.user=User.get({id:data.data.UserName}); Tenía que usar porque si acababa de asignar mi $scope.user a data.data, el usuario ya no usaba el servicio y recibiría un error cuando intenté ApplyChanges otra vez.

Entonces, ¿hay alguna manera de hacer esto más sin pares? Como es, tengo que hacer una llamada adicional para obtener el modelo. ¿Debo enviar un error solo si hay un error y luego tengo una devolución de llamada adicional para obtener el modelo? ¿Hay una mejor manera?

¿Fue útil?

Solución

En primer lugar, su servidor debe devolver errores con relevante Códigos de estado de error HTTP (Ver códigos 4xx y 5xx). De esa manera, solo maneja errores en la devolución de llamada de error:

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;
    }
}

Dicho esto, si $ scope.user es un $ instancia de recursos, entonces no tiene que obtenerlo nuevamente desde el servidor, el método $ save () no cambiará el objeto.

Para copiar valores del objeto 'Usuario' recuperado del servidor al User $ scope. Simplemente use angular.extend ()

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

Vale la pena señalar que angular.extend no realiza una copia profunda, si es necesario, usa jQuery.extend:

jQuery.extend(true, $scope.user, data)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top