2016-05-30 1 views
0

Use Case:Datenobjektvariable in Winkeldienst über Ajax-Aufruf zu aktualisieren

ich einen Dienst in Winkel erstellen möchten, die mir ein Datenobjekt zurück, die eine Variable in Betrieb ist, die über einmal aktualisiert wird Ajax Anruf.

Zum ersten Mal, bis Daten nicht über Ajax empfangen werden, wird {} zurückgegeben. Sobald Daten empfangen werden, werden diese Daten immer zurückgegeben.

Ausgabe:

Die Daten werden ordnungsgemäß in Ajax erhalten. Die Struktur der empfangenen Daten ist ein Objekt. Ich habe es durch Anmeldung in der Konsole überprüft. Das nächste Mal, wenn dieser Dienst aufgerufen wird, ruft er erneut ajax auf, da die Variable im Dienst nicht aktualisiert wird.

Kann jemand vorschlagen, warum ist das passiert und was wäre der idle Weg, um oben zu erreichen?

Code:

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS) { 
    this.tagsData = {}; 

    this.getTagsData = function (cacheMode) { 
     if (JSON.stringify(this.tagsData) != "{}") { 
      console.log("returning from cache"); 
      return this.tagsData; 
     } 

     $http({ 
      method: 'GET', 
      url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
      params: {'params': JSON.stringify({})} 
     }).success(
      function (data, status, headers, config) { 
       if (data && data["success"] && data["success"] == true) { 
        this.tagsData = data["data"]; 
       } 
       return this.tagsData; 

      }).error(
      function (data, status, headers, config) { 
       return {}; 
      }); 

    }; 
}); 

Antwort

2

Sie sollten nicht diese in Ihrer Funktion. Das dieses Schlüsselwort ist Funktionsbereich. Sie aktualisieren nicht die gleiche Variable in Ihrem Rückruf und in Ihrer ersten Bedingung.

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS) { 
var tagsData = {}; 

this.getTagsData = function (cacheMode) { 
    if (JSON.stringify(tagsData) != "{}") { 
     console.log("returning from cache"); 
     return tagsData; 
    } 

    $http({ 
     method: 'GET', 
     url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
     params: {'params': JSON.stringify({})} 
    }).success(
     function (data, status, headers, config) { 
      if (data && data["success"] && data["success"] == true) { 
       tagsData = data["data"]; 
      } 
      return tagsData; 

     }).error(
     function (data, status, headers, config) { 
      return {}; 
     }); 

}; 
}); 

Noch eine Sache, müssen Sie Versprechen statt Ihre Daten zurückgeben. Check the documentation about $q here.

sollte der richtige Weg:

angular.module('myapp', []).service('TagService', function ($http, CONSTANTS, $q) { 
var tagsData = {}; 

this.getTagsData = function (cacheMode) { 
    var defer = $q.defer(); 
    if (JSON.stringify(tagsData) != "{}") { 
     console.log("returning from cache"); 
     defer.resolve(tagsData); 
    }else{ 

    $http({ 
     method: 'GET', 
     url: CONSTANTS['base_url_s'] + 'api/v1/get_all_tags_data/', 
     params: {'params': JSON.stringify({})} 
    }).success(
     function (data, status, headers, config) { 
      if (data && data["success"] && data["success"] == true) { 
       tagsData = data["data"]; 
      } 
      return defer.resolve(tagsData); 

     }).error(
     function (data, status, headers, config) { 
      return defer.reject({}); 
     }); 

    }; 
    } 
    return defer.promise; 
}); 

Und dann sollten Sie rufen:

TagService.getTagsData().then(function(yourTags){ 
    // yourTags contains your data 
}); 
+0

Vielen Dank für solch ein großes response..really es zu schätzen wissen !! – abhinsit

+0

Ihre Lösung funktionierte gut, aber für den Fall, wenn (JSON.stringify (this.tagsData)! = "{}") { console.log ("aus dem Cache zurück"); Rückgabe defer.resolve (TagsData); } es funktioniert nicht .... es sagt undefined Funktion TagService.getTagsData – abhinsit

+0

Zum ersten Mal, bis Daten {} es ruft Ajax Returns Versprechen, die gut funktioniert, aber danach, wenn es erneut aufgerufen wird und soll die Daten zurückgeben direkt es wirft Fehler: TagService.getTagsData (...) ist undefined – abhinsit

Verwandte Themen