2013-05-23 12 views
19

Ich habe einen Dienst erstellt, der den Benutzeranmeldezustand überprüft (den Benutzer anmelden, wenn ein Token existiert, andernfalls auf die Anmeldeseite umleiten).AngularJS - routeProvider Auflösungsaufruf einer Servicemethode

Ursprünglich habe ich diesen Dienst über den routeProvider-Befehl aufgerufen - das funktioniert einwandfrei einmal, aber da Angularjs-Dienste Singleton sind, würde der Test nicht für aufeinanderfolgende Aufrufe ausgeführt werden.

Ich versuchte dann, den Test in eine Methode innerhalb des zurückgegebenen Objekts zu verschieben, aber ich kann nicht scheinen, Ballen zu sein, um den RouteProvider aufzulösen, um eine bestimmte Methode eines Dienstes aufzurufen (was in gewisser Weise sinnvoll ist).

Frage ist, wie stelle ich sicher, dass mein Test jedes Mal ausgeführt wird, wenn die Route geladen wird? In der Egghead-Videoserie (http://www.egghead.io/video/rbqRJQZBF3Q) verwendet er eine Funktion, die dem Controller zugewiesen ist, aber dies scheint nicht die richtige Lösung für eine Produktions-App zu sein (ich möchte keine Funktion einem bestimmten Controller und I zuweisen) glaube, die Angularjs Abhängigkeitsinjektion wird nicht funktionieren).

Antwort

27

Service sind Singletons bedeutet, dass nur eine einzige Zeit initialisiert wird, aber wenn Sie einfach aus dem Dienst zurückkehren, wird es einmal aufgerufen, aber wenn Sie eine Funktion aus dem Service zurückgeben wird es immer wieder aufgerufen. Siehe unten Beispiel für die Arbeit

var app = angular.module('ajay.singhApp', []) 
    .config(['$routeProvider', function($routeProvider) { 
    $routeProvider 
     .when('/view1', { 
     templateUrl: 'views/main.html', 
     controller: 'MainCtrl', 
     resolve: { 
      myVar: function (repoService) { 
       return repoService.getItems().then(function (response) { 
        return response.data; 
       }); 
      } 
     } 
     }) 
     .when('/view2', { 
      templateUrl: 'views/main.html', 
      controller: 'MainCtrl' 
     }) 
     .otherwise({ 
     redirectTo: '/view1' 
     }); 
    }]); 


app.factory('repoService', function ($http) { 
    return { 
     getItems: function() { 
      return $http.get('TextFile.txt'); 
     } 
    }; 
}); 
+1

Danke, das funktioniert. obwohl es immer noch wie eine Arbeit fühlt. Erwartete eine einfachere Lösung :( –

+2

Wie verwende ich zurückgegebene response.data? –

+2

In Ihrem Controller, in diesem Fall MainCtrl, injizieren Sie $ route als Abhängigkeit und $ route.current.locals.myVar wird die Daten enthalten. – ghiden

1

Hinzufügen zu @ Ajay Antwort, können Sie eine Zeichenfolge anstelle eines Standard-Eigenschaftsnamen verwenden, die mit minification helfen:

resolve: { 
    'myVar': function (repoService) { 
     return repoService.getItems().then(function (response) { 
      return response.data; 
     }); 
    } 
} 
+2

Was ist mit Argumente injection array notation? Die Minification wird den Beispielcode die Umbenennung der Funktion brechen Minifer wird tun? Natürlich kann ich $ inject verwenden, aber das ist nicht einfach ... –

Verwandte Themen