2016-09-20 1 views
1

Ich arbeitete mit einem eckigen Projekt, das Controller und Dienste enthält. Problem tritt aus dem Codes folgenden:angularjs Service funktioniert nicht gut, wenn Aufruf für API?

qrcodeCtrl.js

angular 
.module('Admin',['ngResource']) 
.controller('qrcodeCtrl',function($scope,qrcodeservice,statusservice){ 
      $scope.init = function(){ 
       $scope.getQrcodes(); 
      } 
      $scope.getQrcodes = function(){ 
       qrcodeservice.getQrcodes() 
       .then(function(res){ 
        $scope.qrcodes = qrcodeservice.qrcodeList; 
        $scope.loginstatus = []; 
        var logininfo = [];  
        for(var i = 0; i < $scope.qrcodes.length; i++){ 
         logininfo[i] = self.setInterval(getloginfo,10000,i); 
        } 
        function getloginfo(i){ 
         uuid = $scope.qrcodes[i]; 
         statusservice.getstatus(uuid).then(function (result) { 
          console.log(uuid+" "+result.code); 
          uuid = result.uuid; 
          switch(result.code){ 
           case 201 : $scope.loginstatus[uuid] = 'login ...';break; 
           case 200 : $scope.loginstatus[uuid] = 'login success';window.clearInterval(logininfo[i]);break; 
           case 500 : $scope.loginstatus[uuid] = 'login fail';window.clearInterval(logininfo[i]);break; 
           default : $scope.loginstatus[uuid] = 'waitting';break;  //code 408 
          } 
         },function (err) { 
          console.log(err); 
         }) 
         return; 
        } 
       },function(err){ 
        console.log(err); 
       }) 
      } 
      $scope.init(); 
     }) 

statuservice.js

angular 
.module('Admin',['ngResource']) 
.service('statusservice',function ($http,$q) { 
      var auth = this; 
      auth.getstatus = function(uuid){ 
       var defer = $q.defer(); 
       // //debug 
       // var code = 200; 
       // var result = {"uuid":uuid,"code":code}; 
       // defer.resolve(result); 
       // return defer.promise; 
       // //================= 
       $http.get("/check?uuid="+uuid) 
        .success(function(code){ 
         res = {"uuid":uuid,"code":code}; 
         defer.resolve(res); 
        }) 
        .error(function(err,status){ 
         console.log(err); 
         defer.reject(err); 
        }) 
       return defer.promise; 
      } 
     }) 

über die Codes, der Service, um Login-Infos von API ist die Testarbeit in Ordnung. und der Controller stellte ein Intervall ein, um die Login-Informationen ständig vom Dienst zu erhalten. Wenn sich Login-Erfolg (200) oder Login-Fehler (500) herausstellen, wird das Intervall beendet. Diese Codes funktionieren für den Login-Bereich eines Projekts.

Wenn Service nicht den Login-Code von API bekommen und nur den Code schreiben, (Kommentar Abschnitt) der Service funktioniert gut, der Code ist 200 und das Intervall zu stoppen, als Ansicht gut zu machen.

Aber wenn Service den Login-Code von der API erhält, hört das Intervall nicht auf. und von der chrome-konsole finde ich heraus, dass der code die erfolgsänderung auf 200 setzt, aber immer noch das intervall. und die Ansicht wird nicht zum Login-Erfolg gerendert.

Ich lernte Winkel für einige Tage, könnte mir jemand sagen, warum das passiert?

+0

Was ist die 'self' Eigenschaft? Warum hat es 'php' Erweiterung? Warum benutzen Sie nicht den Service '$ interval' von angular? – devqon

+0

Sorry, die PHP-Erweiterung war meine Schuld bei der Codefrage. und die Verwendung von 'self' ist das Ergebnis meiner Suche von Internate, ich finde heraus, dass es sowohl' self.setInterval() 'oder' window.setInterval() ', auch nur' setInterval() 'funktionieren wird. Finnaly, weil du den '$ interval'-Service erwähnst, werde ich es jetzt ausprobieren. – digjack

Antwort

0

Ihre Moduldeklaration und Nutzung ist falsch

angular.module('Admin',['ngResource']).something should not be done; 

dieses initialize Modul Admin jedes Mal.

sollten Sie im folgenden Format erklären

var app = angular.module('Admin',['ngResource']); 

angular 
.module('Admin') 
.service('statusservice',function ($http,$q) { 
}); 

angular 
.module('Admin') 
.controller('qrcodeCtrl',function($scope,qrcodeservice,statusservice){ 
}); 
Verwandte Themen