Variables globales pour une application de page Web unique utilisant Durandal

Ma application a trois points qui sont «global»: un emplacement d'utilisateur avec les valeurs lat et lng, si l'utilisateur est connecté ou non et l'activité qu'ils ont choisie (pensez-y comme une catégorie).

J'aimerais que ces valeurs soient utilisées dans l'application. Chaque écran utilisera un certain ensemble de cette date, donc le chargement par page n'est pas la bonne réponse. L'information ne changera pas non plus à moins que l'utilisateur crée un événement: emplacement, activité ou signe différents.

Comment configurer cela?

Je pense qu'il devrait y avoir une charge initiale lors du démarrage, dans mon fichier principal.js, je charge chaque application et démarrer comme si:

SiteService.js

define([...], function (...) { return { init: function () { return $.when( activityService.getStoredActivity(), locationService.getStoredLocation(), userService.getUsername() ); } } }); 

Main.js

Define ([…, 'modules / siteService'], function (…, site) {…

 site.init().then(function () { app.start().then(function () { ... app.setRoot('viewmodels/shell', 'entrance'); }); }); 

});

Cela garantit que les données sont chargées. De là, dans chacun de mes services, je stocke les informations dans un stockage local, donc je n'ai pas à continuer de déclencher les appels AJAX. Si le stockage local n'est pas là, il le sera.

Le problème vient plus tard lorsque j'ai besoin de ces données dans d'autres pages. Je finis par appeler mon site.init (). Puis () dans la méthode d'activation de chaque page. Ce qui est assez négligé.

Shell.js

 self.activate = function () { ... siteService.init().then(function (activity, location, username) { self.activity(activity); self.location(location); setUsername(username); }); return router.activate(); }; 

Et encore une fois dans:

Welcome.js

 this.activate = function () { site.init().then(function(activity, location) { loc = location; act = activity; load(); }); }); 

Je voudrais définir les valeurs initialement, chaque page étant initialement chargée à partir de ces valeurs, puis utiliser le pub / sub de Durandal pour réagir à tout changement après le fait.

Je pensais seulement utiliser le pub / sub, mais je pensais que je serais confronté au poulet et que les problèmes d'œufs lors de la chargement des données par rapport aux charges de la page (IE Si mon AJAX était chargé en premier et que ma page n'était pas chargée , L'événement se déclenche, mais la page ne reçoit jamais la mise à jour).

Est-il possible de configurer quelque chose comme une classe statique dans javascript pour tirer les données initialement, puis les partager dans tous les modèles de vision? Ou, existe-t-il un moyen de garantir que la valeur sera là quand je charge une page d'abord, comme une app.on ('value', {initialize: true})?

Lorsqu'un module require.js renvoie un objet, cet objet est un singleton, donc vous pouvez avoir quelque chose comme

Settings.js

 define(function() { return { location: { lat: 0, long: 0 }, loggedin: false, activity: "" } }); 

Ensuite, chaque fois que vous définissez les settings tant que dépendance, vous obtiendrez toujours une référence au même objet et vous pouvez obtenir / définir ses champs comme vous le souhaitez.

Changé siteService.js à:

 define([...], function (...) { var module = function () { }; module.prototype.activity = {}; module.prototype.location = {}; module.prototype.username = {}; module.prototype.init = function () { return $.when( activityService.getStoredActivity(), locationService.getStoredLocation(), userService.getUsername() ).then(function (activity, location, username) { module.prototype.activity = activity; module.prototype.location = location; module.prototype.username = username; }); }; return module; }); 

Main.js to

 define([..., 'modules/siteService'], function(..., Site) { site = new Site(); site.init().then(function () { app.start().then(function () { ... app.setRoot('viewmodels/shell', 'entrance'); }); }); 

Et shell.js et welcome.js maintenant, utilisez:

  var site = new Site(); self.activity(site.activity); self.location(site.location); setUsername(site.username); 

et

  var site = new Site(); loc = site.location; act = site.activity;