2016-06-09 2 views
1
//declaring the module 
    var app = angular.module("sachin", ["ng-fusioncharts"]); 
    //declaring a factory 
    app.factory('team',function(){ 
    return { 
      runs_aus : '' 
     }; 
    }); 

    app.controller("myCtrl", function($scope,$http,team){ 
     $scope.australia=[];  
     $scope.total_runs_aus=0; 
     //fetching data from JSON 
     $http.get("convertcsv.json").then(function(response){ 
     $scope.sachin_data=response.data; 
     angular.forEach($scope.sachin_data, function(value, key){ 
      // manipulating data 
      if (value.opposition=="v Australia"){ 
      if (value.batting_score=="-"|| value.batting_score == "TDNB" || value.batting_score == "DNB") 
       $scope.total_runs=$scope.total_runs; 
      else if (value.batting_score.substr(value.batting_score.length - 1) == "*"){ 
       value.batting_score = value.batting_score.substr(1); 
       $scope.total_runs_aus+=parseInt(value.batting_score,10) 
      } 
      else 
       $scope.total_runs_aus+=parseInt(value.batting_score,10); 

     }); 
     $scope.australia.push({ runs:$scope.total_runs_aus}); 
     team.runs_aus=$scope.total_runs_aus; 
     //got final result in $scope.total_runs_aus 
     console.log(team.runs_aus); 
     //printing inside the scope(works fine) 
     }); 
     console.log(team.runs_aus); 
     //printing outside the scope(can't access) 
+0

Sie arbeiten mit asynchronen Daten. Verschieben Sie die Logik, die die Variable totalRuns verwendet, ebenfalls in die Funktion then(). Die Konsolenprotokolle werden ausgeführt, bevor das Versprechen aufgelöst wird, sodass die Daten nicht verfügbar sind. – Gregg

+0

Erwägen Sie die Verwendung von Versprechensketten, wenn Sie möchten, dass ein bestimmter Code ausgeführt wird, nachdem die Anforderung '$ http.get' aufgelöst wurde. Siehe ein Beispiel: http://Stackoverflow.com/a/24360864/5304361 – Gregg

+0

Verstehst du, was ich vorschlagen? Verschieben Sie beispielsweise Ihre Konsolenprotokolle unter den Block 'if else' innerhalb der Funktion .then(). Der Code innerhalb der then() wird ausgeführt, wenn '$ http.get()' fertig ausgeführt ist. Angesichts der Position Ihrer Konsolenprotokolle werden diese ausgeführt, bevor die Daten verfügbar sind. – Gregg

Antwort

1

Sie können einen Dienst verwenden, um diese Daten zu speichern:

app.service('MyService', function() { 

    var self = { 
     'myString': 1, 
     'myObject': {}, 
     'myArray': [], 
     'doSomething': function(param) { 
      self.myString = param 
     }, 
     'anotherFunction': function() { 
      return true; 
     } 
    } 

    return self; 

}); 

Sie müssen nur MyService auf dem Controller injizieren und es wie MyService.myObject = something zugreifen.

+0

Funktioniert nicht für mich :( –

+0

Dies wird nicht funktionieren, weil es nichts mit asynchronen Operationen zu tun hat. – Gregg

1

Der wichtige Teil zu verstehen ist, dass Sie arbeiten async Operationen. Der Code wird weiterhin ausgeführt und druckt Ihre Konsolenprotokolle, obwohl die Daten nicht von $http.get() zurückgegeben wurden. Ihr Code muss dies berücksichtigen und den Code ausführen, der nach der Auflösung der Daten ausgeführt wird.

. Dann() erwartet eine Funktion als Parameter der Methodensignatur. Zum Beispiel:

$http.get("convertcsv.json").then(function(response){ 
    $scope.sachin_data=response.data; 
}).then(function() { 
    console.log('Value in scope:', $scope.sachin_data); 
}); 

oder

function processData = function() { 
    console.log('Value in scope:', $scope.sachin_data); 
}; 

$http.get("convertcsv.json").then(function(response){ 
    $scope.sachin_data=response.data; 
}).then(processData); 

oder Kette mehrere verspricht zusammen (Sie Winkel von $ q als Abhängigkeit hinzufügen müssen):

function processData1 = function(data) { 

    //Create a deferred object. 
    var defer = $q.defer(); 

    //Do something with data. 
    console.log('Value in scope:', data); 

    //Pass data to next promise in promise chain. 
    defer.resolve(data); 

    //Resolve data to be returned. 
    return defer.promise; 
}; 

function processData2 = function(data) { 

    //Create a deferred object. 
    var defer = $q.defer(); 

    //Do something else with data. 
    console.log('Value in scope:', data); 

    //Pass data to next promise in promise chain. 
    defer.resolve(data); 

    //Resolve data to be returned. 
    return defer.promise; 
}; 



$http.get("convertcsv.json") 
    .then(processData1) 
    .then(processData2); 

haben Sie einen Blick auf:

Der Code als Syntaxfehler kann, da es nicht getestet wurde. Links sind eine allgemeine Referenz und nicht spezifisch für $ q, aber die Konzepte sind konsistent.

+0

Die Versprechen Verkettung funktioniert jetzt gut :) –

Verwandte Themen