2016-03-22 9 views
1

Wie Sie wissen, verwarf Angular vor kurzem die http.get.success,error Funktionen. So ist diese Art der Anrufe werden nicht mehr in Ihrem Controller empfohlen:

$http.get("/myurl").success(function(data){ 
    myctrl.myobj = data; 
})); 

Vielmehr ist diese Art von Anrufen verwendet werden sollen:

$http.get("/myurl").then(
    function(data) { 
     myctrl.myobj = data; 
    }, 
    function(error) { 
     ... 
    } 

Problem ist, einfache Feder REST-Modellen arbeiten mit dieser neue Code. Ich heruntergeladen vor kurzem einen Beispielcode mit dem oben alten Erfolgsfunktion und ein REST-Modell wie folgt aus:

@RequestMapping("/resource") 
public Map<String,Object> home() { 
    Map<String,Object> model = new HashMap<String,Object>(); 
    model.put("id", UUID.randomUUID().toString()); 
    model.put("content", "Hello World"); 
    return model; 
} 

Diese Karte wie {id:<someid>, content:"Hello World"} für die $http.get() zurückrufen sollte, aber es erhält nichts - der Blick leer ist.

Wie kann ich dieses Problem beheben?

+0

Können Sie es durch den Browser? –

+0

Ja, ich kann: '{" id ":" f77e3886-976b-4f38-b84d-ae4d322759d4 "," Inhalt ":" Hallo Welt "}' – cst1992

+0

Funktioniert es mit dem 'success()' statt dann()? –

Antwort

1

Die Erwartung des Ergebnisses unterschiedlich ist. Es ist die Antwort und nicht das Datenobjekt direkt.

documentation sagt:

// Simple GET request example: 
$http({ 
    method: 'GET', 
    url: '/someUrl' 
}).then(function successCallback(response) { 
    // this callback will be called asynchronously 
    // when the response is available 
    }, function errorCallback(response) { 
    // called asynchronously if an error occurs 
    // or server returns response with an error status. 
    }); 

Eigenschaften der Antwort sind

data – {string|Object} – The response body transformed with the transform functions. 
status – {number} – HTTP status code of the response. 
headers – {function([headerName])} – Header getter function. 
config – {Object} – The configuration object that was used to generate the request. 
statusText – {string} – HTTP status text of the response. 

Da das Datenobjekt benötigt wird,

Bitte konvertieren Sie den Code als

$http.get("/resource").then(
    function(response) { 
     myctrl.myobj = response.data; 
    }); 
5

Das erste (von vier) Argument, das an success() übergeben wird, sind die Daten (d. H. Körper) der Antwort.

Aber das erste (und eindeutige) Argument, das an then() übergeben wird, sind nicht die Daten. Es ist die vollständige HTTP-Antwort, die die Daten, die Header, den Status und die Konfiguration enthält.

Also, was Sie wirklich brauchen, ist

$http.get("/myurl").then(
    function(response) { 
     myctrl.myobj = response.data; 
    }, 
    function(error) { 
     ... 
    }); 
+0

Ich werde das versuchen und sehen. – cst1992

+0

Dies funktioniert mit 'response.data'. – cst1992

-1

dann muss ein neues Versprechen zurückgegeben werden, damit Sie es mit Defer behandeln sollten.

var myApp = angular.module('myApp', []); 

myApp.factory('modelFromFactory', function($q) { 
return { 

     getModel: function(data) { 
     var deferred = $q.defer(); 
     var items = []; 
      items.push({"id":"f77e3886-976b-4f38-b84d-ae4d322759d4","content":"Hello World"}); 
     deferred.resolve(items); 
     return deferred.promise; 
    } 
}; 
}); 

function MyCtrl($scope, modelFromFactory) { 
modelFromFactory.getModel() 
    .then(function(data){ 
     $scope.model = data; 
}) 

} 

Hier ist Geige arbeiten ->https://jsfiddle.net/o16kg9p4/7/

+0

Die Antwort ist für die Frage nicht relevant. OP fragt nach Umgang mit http Anfragen –

+0

Ich möchte nur eine neue Tradition zeigen, er könnte es mit Erfolg tun, aber er bat uns, mit einem anderen Weg zu arbeiten. Ich versuche ihm zu helfen und du magst es nicht so traurig. – nolines

+0

Nur weil Sie etwas schreiben können, heißt das nicht, dass es geschrieben werden muss. Auflösungen sind im genannten Fall sinnlos. –

Verwandte Themen