3 Stimmen

Das Aufrufen des Angular-Services von außerhalb von JS über .scope().call() hängt die Anfrage auf

Ich arbeite daran, einen Google+ Anmeldebutton zu meiner Angular-App hinzuzufügen, und es funktioniert größtenteils, außer für die Verarbeitung des Callback-Ergebnisses. Der Callback von der G+ Anmeldung ist eine externe JS-Funktion namens signinCallback, die wie folgt aussieht:

//Die Google+ Anmeldung wird hier verarbeitet
function signinCallback(authResult) {
angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult);
}

Der einzige Weg, den ich herausfinden konnte, um das authResult zurück in den Controller zu übergeben, war, eine Controller-Methode über element.scope() aufzurufen. handleGoogleSignin wird erfolgreich aufgerufen, und innerhalb dieser Funktion gibt es einen http.get Service-Aufruf, der wie folgt aussieht:

User.getSocialKey(key).then(function(data) {
    console.log(data);
});

User ist ein Service, und getSocialKey sieht so aus:

getSocialKey: function(etag) {
    console.log("Hit the social key service with the etag: " + etag);
    return $http({
        url: '/api/user/social',
        method: 'post',
        data: {etag:etag}
    }).then(function(result) {
        console.log("Returning promise from social service");
        return result.data;
    });
},

Die erste Log-Anweisung wird erfolgreich erreicht, dann passiert nichts. Die Anfrage wird nie gesendet. Wenn ich jedoch auf der Seite auf etwas klicke, das ein ng-model Attribut hat (zum Beispiel, ein Kontrollkästchen), wird die Anfrage dann gesendet und empfangen. Also meine Frage: Warum wird mein Angular-Service-Aufruf ausgesetzt, bis ich auf etwas klicke? Warum wird er nicht sofort durchgeführt?

Ich habe versucht, getSocialKey durch funktionierende Service-Aufrufe zu ersetzen, aber das gleiche Problem tritt auf. Ich glaube, das Problem liegt darin, die Funktion mit angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult); aufzurufen, bin mir aber nicht sicher. Hat das schon mal jemand gesehen?

4voto

zs2020 Punkte 53241

Entschuldigung, ich kann nicht testen, aber ich denke, du solltest .$apply() aufrufen, da die Aktion außerhalb des AngularJS-Bereichs ausgelöst wird.

function signinCallback(authResult) {
    angular.element($("#btnGooglePlus")).scope().handleGoogleSignin(authResult);
    angular.element($("#btnGooglePlus")).scope().$apply();
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X