2015-04-29 7 views
6

Ciao Sto cercando di usare import.io per racimolare alcuni punteggi di calcio. Sono riuscito a far funzionare il JS con l'API e fornire i dati. Il problema è che deve essere in un ambito privato all'interno del controller poiché non riesco a eseguire una ripetizione su di esso.Aggiornamento dell'ambito AngularJS dalla callback asincrona della libreria di terze parti

Qualcuno può dirmi perché, e anche se qualcuno ha una buona guida su Scope che sarebbe probabilmente più utile.

latestScores.controller('ScoresController', function ($scope) { 
    $scope.pots = []; 
    var io2 = new importio("XXX", "XXXXXX[API KEY]XXXXXXXX", "import.io"); 


    io2.connect(function (connected) { 

     if (!connected) { 
      console.error("Unable to connect"); 
      return; 
     } 


     var data; 


     var callback = function (finished, message) { 

      if (message.type == "DISCONNECT") { 
       console.error("The query was cancelled as the client was disconnected"); 
      } 

      if (message.type == "MESSAGE") { 
       if (message.data.hasOwnProperty("errorType")) { 

        console.error("Got an error!", message.data); 
       } else { 
        data = message.data.results; 
       } 
      } 
      if (finished) { 

       pots = data; 
       console.log(pots); /* This gives me an object */ 
     } 
     } 
     io2.query({ 
     "connectorGuids": [ 
     "d5796d7e-186d-40a5-9603-95569ef6cbb9"], 
    }, callback); 
    }); 
    console.log($scope.pots); /* This gives me nothing */ 
}); 
+3

Stai asigning dati pentole variabili locali, provare assegnandolo a $ scope.pots nel callback – ecyshor

+0

non @NicuReut locali - pentole - è variabile globale nella finestra :-) – Grundy

risposta

2

associazione dati angularjs non può sapere quando si aggiorna il proprio ambito in un callback da una libreria di terze parti.

Nella richiamata, fare questo:

$scope.pots = dataReceived 
$scope.$apply(); 

Se si desidera saltare chiamare $ scope.apply(), è necessario utilizzare angolare proprio modulo promessa (chiamato $ q) e avvolgere il vostro apis mette in un servizio.

Inoltre, se l'API è basata su WebSocket, è necessario sottoscrivere l'evento $ scope.on ('$ destroy') per disconnettersi dalla propria API quando il controller è scomparso.

+1

Grazie amico, sì ho usato promesse prima ma dal momento che questo era un modulo di terze parti che mi ha buttato fuori. – craigie2204

1

ng-repeat ha il proprio scopo. Nel tuo caso i tuoi dati di assegnazione alla variabile locale invece di assegnarlo alla variabile di ambito.

cambiamento questo pezzo di codice

if (finished) { 

       pots = data; 
       console.log(pots); /* This gives me an object */ 
     } 

a

if (finished) { 

       $scope.pots = data; 
       console.log($scope.pots); /* This gives me an object */ 
     } 
Problemi correlati