2016-04-14 8 views
6

Jetzt Angular 1.5.4 ermöglicht es Ihnen schließlich, Fortschrittsereignis auf $ http-Provider zu verfolgen, aber aus irgendeinem Grund bekomme ich das $ rootScope als Antwort anstelle eines tatsächlichen Fortschritts (ich benutze es für Uploads) Informationen. Aufgrund des Mangels an Beispielen fand ich einige Tests im Angular Repo und folgte diesem, aber ohne Erfolg.

restClientInstance.post = function (requestParams) { 
    var postParams = { 
     method: "POST", 
     url: API_URL + requestParams.url, 
     headers: requestParams.headers, 
     data: requestParams.data, 
     eventHandlers: { 
      progress: function (c) { 
       console.log(c); 
      } 
     }, 
     uploadEventHandlers: { 
      progress: function (e) { 
       console.log(e); 
      } 
     } 
    }; 

    var promise = $http(postParams) 
    $rootScope.$apply(); 
    return promise; 
}; 

In beiden Fällen tröstet es $ rootScope statt der lengthComputable

+0

die Antwort unter Verwendung von reinem Winkel: http://stackoverflow.com/a/41930083/2179157 –

Antwort

1

Nun, ich endete damit, etwas zu tun und nur damit selbst umzugehen, da die XHR-Ereignisse, die $ http hinzugefügt wurden, nicht für mich funktionieren.

var xhttp = new XMLHttpRequest(); 
var promise = $q.defer(); 

xhttp.upload.addEventListener("progress",function (e) { 
    promise.notify(e); 
}); 
xhttp.upload.addEventListener("load",function (e) { 
    promise.resolve(e); 
}); 
xhttp.upload.addEventListener("error",function (e) { 
    promise.reject(e); 
}); 

xhttp.open("post",API_URL + requestParams.url,true); 

xhttp.send(requestParams.data); 

return promise.promise; 
+0

Der Fortschritt aktualisiert sich, wie es sollte und alles funktioniert wie es sollte Ich denke, 1.5.4 ist gerade fehlerhaft im Moment. –

+0

Es ist eine Schande, dass dies in den $ http-APIs nicht korrekt verdrahtet ist. – jusopi

+0

Neugierig, bist du auf die Seite 1.5.4 github gegangen und hast ein Problem gemeldet? – jusopi

0

Als here, in dem Versprechen, der dritte Parameter in der Dokumentation gesehen eine notify Funktion ist.

notify(value) - Bietet Aktualisierungen zum Status der Ausführung des Versprechens. Dies kann mehrmals aufgerufen werden, bevor das Versprechen entweder aufgelöst oder abgelehnt wird.

Es kann wie folgt verwendet werden:

$http(requestData) 
    .then(
     function success() { 
      console.log('success'); 
     }, 
     function error() { 
      console.log('error'); 
     }, 
     function notify() { 
      console.log('notified'); 
     } 
    ); 
+1

Ich habe versucht - Notify feuert nie für mich. –

+0

Ich bin mir ziemlich sicher, dass notify tatsächlich nie feuert. –

+0

Komisch, ich habe in meiner eigenen App benachrichtigt, könnten Sie etwas Code in eine Geige stecken? –

1

note-Ich habe nicht mit NG 1.5.4 gearbeitet, unter dem Beispiel für die Nutzung vorhandener pre 1.5.4 APIs


die notify(event) API ist Teil des Objekt verschoben, wenn Sieanrufen. Ich bin mir nicht sicher, was eine praktische Umsetzung dieses in Bezug auf eine typische get/Put/Post Anruf über $http wäre. Aber wenn man es in Aktion sehen möchten, können Sie etwas tun:

einige Service-API

var mockRqst = function(){ 
    var d = $q.defer() 
    var crnt = 0 

    $off = $interval(function(){ 
     d.notify(crnt) 
     crnt += 5 

     if (crnt >= 100) 
     { 
      $interval.cancel($off) //cancel the interval callback 
      d.resolve("complete") 
     } 
    } 

    return d.promise 
}  

mit der Benachrichtigung

someService.mockRqst() 
.then(thenCallback, catchCallback, function(update){ 
    console.log("update", update) 
}) 

codepen - http://codepen.io/jusopi/pen/eZMjrK?editors=1010

Auch hier muss ich betonen, dass ich nicht ganz sicher bin, wie Sie dies in einen tatsächlichen externen http-Aufruf einbinden können.

+0

Siehe eckige 1.5.4 (die vor etwa einem Tag veröffentlicht wurde) schließlich fügt die Ereignis-Listener zu $ ​​http Aufruf, den Sie an zugrunde liegenden XHR binden können, so dass Sie zuhören können xhr.progress und xhr.upload.progress, aber hier ist mein Problem, wenn ich meine eigene Upload-Anfrage mit plain JS onprogress erstellt schön alle Informationen über die Datei zurück, aber die Implementierung in Angular 1.5.4 gibt mir $ rootScope, wo es das Ereignis sollte. –

9

In AngularJS v1.5.7 funktioniert gut. Wenn Sie die Chance haben, empfehle ich ein Upgrade!

...//formData = new FormData(); etc... 
var postParams = { 
    method: 'POST', 
    url: yourURLWS, 
    transformRequest: angular.identity, 
    uploadEventHandlers: { 
     progress: function (e) { 
        if (e.lengthComputable) { 
        $scope.progressBar = (e.loaded/e.total) * 100; 
        $scope.progressCounter = $scope.progressBar; 
        } 
     } 
    }, 
    data: formData, 
    headers: {'Content-Type': undefined } 
}; 

var sendPost = $http(postParams); //etc... 

in HTML Sie haben:

<progress id="progress" max="100" value="{{progressBar}}"></progress>{{progressCounter}}% 

Ergebnis:

progress result

+0

Ein anderer Weg ist '$ http.post (yourURLWS, formData, postParams)' (ohne die Redundanz) –