2016-07-20 2 views
1

Ich habe zwei Controller, die wir ControllerA und ControllerB nennen können, beide teilen Daten von einem Service, den ich gemacht habe, indem ich Guides lese und herum lese. Ich bin mir nicht sicher, ob das, was ich sehe, korrekt ist und ich vielleicht einen Anbieter brauche.Korrekter Ansatz für das Laden von Service JSON zwischen zwei eckigen 1 Controllern (muss Ressource nur einmal laden)

Hier Mein Service:

angular.service("getJson", ['$http','$q', function($http,$q){ 
var deferred = $q.defer(); 

this.data = ""; 

$http.get('test.json') 
.then(function(data){ 
    deferred.resolve(data); 
}); 

this.getResource = function(){ 
    console.log("hey this has loaded!"); 
    return deferred.promise; 
} 

}]);` 

Dann in controllerA und ControllerB ich das Versprechen, lade ich gemacht. Sie sind gleich.

var jsonPromise = getJson.getResource(); 
jsonPromise.then(function(data){ 
    $scope.rowData = data; 
}) 

Ich sehe in meiner Konsole log die Ladung passiert zweimal! Ist das, was ein Anbieter ist? Gibt es nicht eine Möglichkeit zu sagen: "HEY this loaded lade schon wieder nicht hier ist die Ressource."

+0

Ja getJson.getResource() wird jedes Mal aufgerufen. Was genau versuchen Sie zu vermeiden .... getJson.getResource() wird aufgerufen oder die $ http.get() wird aufgerufen oder beides? – jbrown

+1

Sie machen bereits eine Server-Anfrage und teilen die gleiche Zusage – charlietfl

+0

* "Ich sehe in meiner Konsolen-Log die Ladung passiert zweimal" * ... nur weil Sie 'getResource()' mehr als einmal aufrufen. Verschiebe das 'console.log()' zu 'then()' von '$ http' und sehe es nur einmal – charlietfl

Antwort

0

Sie könnten der'getJson'-Dienstmethode etwas Variablen-Caching hinzufügen. Wenn Sie die Methode'getJson 'zum ersten Mal aufrufen, ist die Variable' data 'nicht definiert. In diesem Fall werden die Daten geladen. Andernfalls werden die variablen Daten zurückgegeben.

Schnell Beispiel:

angular.service('getJson', function($http,$q) { 
    // cache var 
    var data; 

    // service methods 
    return { 
     getResource: function(){ 
      // create promise 
      var deferred = $q.defer(); 
      /* check cache */ 
      if(angular.isDefined(data)) { 
       deferred.resolve(data); 
      } else { 
       /* else load from http.get */ 
       $http.get('test.json').then(function(response){ 
        deferred.resolve(response); 
        data = response; 
       }); 
      } 
      // return promise 
      return deferred.promise; 
     } 
    } 
}) 

Update-Rückkehr 1 Versprechen, wenn gleiche http.get gleichzeitig aufgerufen wird

angular.service('getJson', function($http,$q) { 
    // cache var 
    var data; 
    var curProm; 
    var inProgress = false; 

    // service methods 
    return { 
     getResource: function(){ 
      // check if in progress 
      if(inProgress) return curProm; 
      // create promise 
      var deferred = $q.defer(); 
      /* check cache */ 
      if(angular.isDefined(data)) { 
       deferred.resolve(data); 
      } else { 
       // set progress 
       inProgress = true; 
       curProm = deferred; 
       /* else load from http.get */ 
       $http.get('test.json').then(function(response){ 
        deferred.resolve(response); 
        data = response; 
        inProgress = false; 
       }); 
      } 
      // return promise 
      return deferred.promise; 
     } 
    } 
}) 
+0

Wie gehst du im Controller um, wenn eine Bedingung ein Versprechen zurückgibt und das andere nicht? – charlietfl

+0

Ich war zu schnell tooo :) Überprüfen Sie die aktualisierte Antwort, lösen beide Ansätze ein Versprechen :) Sorry –

+0

Dies wird nicht verhindern, dass 2 gleichzeitige Controller in der gleichen Ansicht mehrere Anfragen. Auch sollte "deferred.resolve (data)" zuerst sein; – charlietfl