2016-03-24 11 views
0

I 2-Controller haben, verwenden beide die gleiche Update-Methode Daten zu erhalten: Jetzt

function updateData($http, $scope, $timeout, $sce, settings) { 
    $timeout(function() { 
     if (settings) { 

      getSettings($http, $scope); 
     } 
     else { 
      getDataA($http, $scope); 
      getDataB($http, $scope); 
     } 
     updateData($http, $scope, $timeout, $sce, settings); 
    }, 1000); 
} 

, wenn die Haupt-Seite zu aktualisieren:

angular.module('project') 
    .controller('mainController', function($http, $scope, $timeout, $sce) { 
     updateData($http, $scope, $timeout, $sce, false); 
    }) 

    .controller('settingsController', function($http, $scope, $timeout, $sce) { 

     updateData($http, $scope, $timeout, $sce, true);   
    }) 

meine updateData wie folgt aussieht (mit mainController) ich immer ‚null‘ Nachrichten bekommen, weil der Prozess nicht alle Methodenaufrufe nicht abgeschlossen, und wenn sie an einem anderen Standort Schalt (mit settingsController) es altert dauert es geladen werden, da alle Anfragen von dem vorherigen haben zuerst abgeschlossen sein . Wie kann ich alle ausstehenden Updates beim Aktualisieren/Wechseln der Site direkt "killen"?

+0

Seine falsche implementation..passing Abhängigkeit als Parameter Methode ist nicht richtig .. eher Methode es in einem Dienst sein soll. damit wir nach Daten von ihnen fragen können. –

Antwort

3
  1. Diese Implementierung ist falsch. Ich denke nicht, dass es eine gute Idee ist, eine Abhängigkeit an eine offene Funktion zu übergeben und sie zu verwenden. Dies kann zu schwer zu erkennenden Fehlern führen.

  2. Ihre updateData Funktion ist eine Ressource Killer. Es wiederholt sich jede Sekunde ohne Einschränkung oder Kontrolle.

Es gibt ein Designproblem in Ihrem Code. Sie sollten es überdenken, es auf eine standardmäßige und effektive Weise zu gestalten.

Die Antwort auf Ihre Frage ist, dass $timeout ein Versprechen zurück. Mit der Methode $ timeout.cancel können Sie das Zeitlimit abbrechen.

var timeoutPromise = $timeout(foo(), 1000); 

$timeour.cancel(timoeoutPromise); 
0

sollten Sie einen Dienst anstelle der Funktion machen. Dann müssen Sie den Dienst in die Controller injizieren.

project.service('updateService', function(){ 
    ...some logic here... 
}); 

dann injizieren:

angular.module('project') 
.controller('mainController', function($http, $scope, $timeout, $sce, updateService) { 
     ...use "updateService" methods here... 
}) 

und wenn Sie einen Controller, eine kleine Spitze schreiben, schreiben Sie es wie folgt aus:

angular.module('project') 
.controller('someController', ['$scope', function($scope){ 

}]; 

das ist wichtig, wenn Sie möchten, um minimierte Version Ihres Codes.

+0

also lege ich 2 Methoden (updateData und updateSettings) in einen Dienst, rufe einen in jedem Controller auf, der dann automatisch stoppt, wenn der Controller sich ändert/aktualisiert? – JustSomeDude

+0

@JustSomeDude, ja, und das ist das Richtige. es ist sicherer und einfacher zu debuggen. Ich hoffe, dir hat meine Antwort gefallen. Wenn ich Ihnen auf andere Weise helfen kann, fragen Sie bitte. – asafel

+0

Ich habe nur die Dienste überprüft und ich denke, ich bin immer noch verwirrt, es scheint mir, als ob ein Dienst eigentlich nur eine Funktion ist, also erstelle ich jetzt zwei Dienste? Eine für jeden Controller (z. B. updateSettingsService und updateDataService)? – JustSomeDude

Verwandte Themen