1

Quelle est la meilleure façon de partager certaines données sur tous les contrôleurs et champs d'application de mon application de page unique? Disons que j'ai un petit ensemble de données que je veux pouvoir accéder partout, et je ne veux pas interroger la base de données chaque fois que j'en ai besoin.AngularJS: Comment partager des données sur toutes les pages et le contrôleur de mon SPA?

+2

Utilisez 'RootScope' et vous pouvez accéder à toutes les données RootScope dans l'un des contrôleurs portée – Sajan

+1

@Xsmael: Utiliser rootScope de $, ce qui est une variable globle dans angulaire js – Jigar7521

Répondre

3

services de données partagés semble être le meilleur aproche pour votre cas. Il y a $rootScope comme portée globale, mais, $rootScope ne devrait pas être utilisé pour une telle chose en raison de problèmes de performance. $rootscope fait partie du cycle de digestion angulaire, donc quand vous y ajoutez quelque chose, vous ajoutez également quelque chose de plus à vérifier. Par conséquent, il n'est pas recommandé d'utiliser à moins que ce soit extrêmement nécessaire.

Par exemple, pour les services simples:

app.service('SharedDataService', function() { 
    var Data = { 
     field1: 'qweqwe', 
     field2: '12312' 
    }; 

    return Data; 
}); 

Pour les services complexes opérations asynchrones:

app.service('SharedDataService', function() { 
    var self = this; 
    this.getData = function() { 
     if(self.cachedData){ 
      return $q.resolve(self.cachedData); 
     } 

     return $http.get('my-data-url').then(function (response) { 
      self.cachedData = response.data; 
      return self.cachedData; 
     }); 
    }; 
}); 

et le contrôleur:

app.controller('MyController', function ($scope, SharedDataService) { 
    SharedDataService.getData().then(function (data) { 
     $scope.data = data; 
    }); 
}); 
+0

uh , excusez-moi ou cette question stupide, mais dois-je utiliser le même nom "SharedDataService" comme vous l'avez mentionné? Je demande qu'en raison de la façon dont vous avez expliqué – Xsmael

+0

Pas de problème @Xsmael vous pouvez le nommer quel que soit le DataService que vous voulez mais assurez-vous de garder des noms cohérents en fonction de la responsabilité du service. En outre, il ya un guide de style pour angularjs écrit à l'origine par Jon Papa et maintenu par lui et la communauté qui peut vous aider.Il a une bonne considération sur les noms de composants et d'autres choses, vérifiez cela sur –

+0

merci! quand le code du service est-il exécuté? est-ce seulement quand on accède à un contrôleur où il a été injecté ou à partir du moment où l'application est chargée? – Xsmael

3

Les données à stocker dans rootscope variable $

(ou)

données à stocker dans les services

1

En AngularJS vous pouvez effectuer cette opération en différentes manières. soit vous pouvez utiliser $ rootscope ou vous pouvez diffuser des données ou vous pouvez utiliser des services ou des usines.

Mais le pari préféré est d'utiliser des services. La première chose est que c'est facile. Vous pouvez utiliser le même service sur chaque contrôleur pour accéder aux données.

Si vous voulez en savoir plus sur les services angularjs, veuillez vérifier le lien ci-dessous.

http://viralpatel.net/blogs/angularjs-service-factory-tutorial/

2

meilleur pour utiliser le service dit commonService et après l'obtention de données du magasin de base de données sur une variable à l'intérieur du service comme celui-

this.dbDataSearch = function(parameters){ 
    // Search record from database 
    this.resultData = data; 
} 

Contrôleur 1:

$scope.data = commonService.resultData; 

Contrôleur 2:

$scope.data = commonService.resultData; 

Contrôleur n:

$scope.data = commonService.resultData; 
+0

J'aime cette approche mais une question: quand resultData est mis à jour, sera-t-il également mis à jour dans d'autres contrôleurs l'utilisant? et vous n'avez pas montré où vous déclarez le service – Xsmael

+0

Oui, c'est la beauté de Angularjs –

+0

cool! :Oh merci! – Xsmael