Domanda

Sto lavorando con le risorse angolari cercando di utilizzare la funzione Angular $ Save.

Per impostazione predefinita $ Save invia il modello all'URL di servizio. Tuttavia, sembra che si aspetta che il modello venga restituito al servizio (il mio modello è vuoto se non lo faccio). Mi chiedevo quale sia il modo migliore per restituire messaggi ed errori al controller.

La mia soluzione era quella di creare una nuova classe nel mio PHP che ha un array di errori che memorizza eventuali errori nell'elaborazione e un campo che memorizza il modello per il ritorno. Viene quindi inviato ed elaborato nella funzione call-back:

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

Queste linee qui: $scope.user=User.get({id:data.data.UserName}); Dovevo usare perché se avessi appena assegnato il mio $scope.user a data.data, l'utente non utilizzava più il servizio e avrei ricevuto un errore quando ho provato a farlo ApplyChanges ancora.

Quindi, c'è un modo per farlo più apparentemente? Come è, devo effettuare un'ulteriore chiamata per ottenere il modello. Devo inviare un errore solo se c'è un errore e quindi avere un richiamata aggiuntivo per ottenere il modello? C'è un modo migliore?

È stato utile?

Soluzione

Prima di tutto, il tuo server dovrebbe restituire errori con pertinente Codici di stato dell'errore HTTP (Vedi codici 4xx e 5xx). In questo modo, gestisci solo errori nel callback di errore:

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

Detto questo, se $ Scope.user è un $ istanza delle risorse, quindi non è necessario ottenerlo di nuovo dal server, il metodo $ save () non cambierà l'oggetto.

Per copiare i valori dall'oggetto "utente" recuperato dal server in $ APPE.USER Basta utilizzare Angular.extend ()

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

Vale la pena notare che angular.extend non esegue una copia profonda, se necessario, utilizzare jQuery.extend:

jQuery.extend(true, $scope.user, data)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top