Frage

Ich arbeite mit eckigen Ressourcen und versuche, die angular $ Save -Funktion zu verwenden.

Standardmäßig sendet $ Save das Modell zurück an die Service -URL. Es sieht jedoch so aus, als würde das Modell in den Dienst zurückgegeben (mein Modell ist leer, wenn ich dies nicht tue). Ich habe mich gefragt, wie der beste Weg ist, Nachrichten und Fehler in den Controller zurückzugeben.

Meine Lösung bestand darin, in meinem PHP eine neue Klasse zu erstellen, die über ein Fehler -Array verfügt, das alle in der Verarbeitung auftretenden Fehler und ein Feld speichert, das das Modell für die Rückkehr speichert. Es wird dann zurückgesendet und in der Rückruffunktion verarbeitet:

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

Diese Zeilen hier: $scope.user=User.get({id:data.data.UserName}); Ich musste verwenden, denn wenn ich gerade meine zugewiesen habe $scope.user zu data.data, Der Benutzer benutzte den Dienst nicht mehr und ich bekam einen Fehler, als ich es versuchte ApplyChanges wieder.

Gibt es also eine Möglichkeit, dies scheinbarer zu tun? Wie es ist, muss ich einen zusätzlichen Anruf zurückbringen, um das Modell zu erhalten. Sollte ich nur einen Fehler senden, wenn ein Fehler vorliegt und dann einen zusätzlichen Rückruf haben, um das Modell zu erhalten? Gibt es einen besseren Weg?

War es hilfreich?

Lösung

Zunächst sollte Ihr Server Fehler mit relevantem zurückgeben HTTP -Fehlerstatuscodes (Siehe 4xx- und 5xx -Codes). Auf diese Weise behandeln Sie nur Fehler im Fehlerrückruf:

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

Das heißt, wenn $ scope.user a ist $ ressourceninstanz, Dann müssen Sie es nicht erneut vom Server abholen, die Methode $ Save () ändert das Objekt nicht.

Um Werte aus dem vom Server abgerufenen Objekt "Benutzer" in den $ scope zu kopieren. Angular.extend ()

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

Ist erwähnenswert angular.extend Führen Sie bei Bedarf keine tiefe Kopie durch, verwenden Sie bei Bedarf keine jQuery.extend:

jQuery.extend(true, $scope.user, data)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top