7
votes

Résolution de l'application angulaire, non contrôleur, pour les données préchargées ASYNC

Cette question, parmi beaucoup d'autres, montre à utiliser Un de niveau de contrôleur (code> résolve pour asynchronisation doit être chargé avant la démarrage d'une application.

J'ai beaucoup de contrôleurs, avec tous les itinéraires définis séparément dans chaque module ... à l'aide de résolution serait ridicule pour moi si elles dépendent tous des données . J'ai aussi des directives qui dépendent des données (recherche automatique, etc.).

N'y a-t-il pas une meilleure façon de faire: "Charger des données (à l'aide d'un service angulaire) avant que chaque contrôleur ne soit affiché"? J'ai besoin de l'application pour charger, ASYNC récupérer les données et j'utilise NG-Show avec certaines données Rootscope indiquant le chargement ou le modèle de contrôleur. J'ai essayé de le mettre dans app.run , mais je ne pouvais pas le faire fonctionner correctement ... tout ce qui est asynchrone dans ce bloc semble empêcher l'application.

aide?


0 commentaires

3 Réponses :


1
votes

Voici ce que j'ai fait. Je ne suis pas un grand fan de cette solution, mais c'est le meilleur que j'ai pu trouver jusqu'à présent.

Tout d'abord, vous pouvez avoir plusieurs résoudre code> dans chaque itinéraire, Comme: p> xxx pré>

puisque vous ne pouvez pas injecter les services d'application dans le bloc de configuration, j'ai créé un grand objet ancien dans un autre fichier contenant des raccourcis à mes services: P >

app.resolves = (function(){
  // Resolves allow us to use `deferred`s to only
  // load our template after the data it requires
  // has been provided by the server.
  var resolve = {};

  resolve.UserAccount =
  ['Users', function (Users) {
     return Users.fetchActive();
  }];

  resolve.Posts =
  ['Posts', function(Posts) {
     return Posts.getAllPosts();
  }];

  // Public API
  // @param string name
  return function (name) {
    return resolve[name]
  };
})();


4 commentaires

N'y a-t-il pas un moyen de résoudre une "application"? Si j'ai 15 contrôleurs différents, je veux seulement spécifier un objet "résolution" une fois (app ... Résoudre: myData), pas le même bloc 15 fois.


Peut-être que vous pourriez essayer quelque chose comme ceci: jsfiddle.net/n99ez Je n'ai pas testé au-delà de ne pas être toutes les erreurs javascript. Votre fonction app.ResDUsers () doit renvoyer une promesse ou un objet avec chaque membre étant une promesse. Tant que c'est dans votre application Config directement après vos déclarations d'itinéraire, je penserais que cela ferait le tour.


En fait, essayez celui-ci: jsfiddle.net/jjehs Cela préservera les résolutions existantes sur un itinéraire. Assurez-vous simplement que vous les déclarez dans la syntaxe d'objet comme mon exemple de route.


J'aime ce dernier!



0
votes

Je pense que, puisqu'il n'y a pas de moyen évident de faire de la configuration de résolution de niveau d'application, la meilleure chose à faire est de modifier réellement les fonctionnalités $ routirovider à l'aide d'un décorateur. De cette façon, vous pouvez vérifier si un résolution config est défini sur chaque voie d'application et ajoutez / fusionner une promesse de résolution spéciale qui chargera des données asynchronisées ou de continuer avec les données nécessaires, avec le bonus d'avoir un centre central. pointez pour tester ou modifier lorsque vous avez besoin.

Je me débats avec ce même problème maintenant. Je vais essayer de faire un code générique / réutilisable ici et poster ma solution très bientôt sur GitHub. Je vais essayer de mettre à jour cette réponse avec un exemple correct ici aussi.


0 commentaires

1
votes

Je sais que cette question est vieille, mais comme il n'y a pas de réponse acceptée, ni propre, je tente de résoudre cela aussi.

L'absence d'un état de résolution par application me dérangeait depuis un moment et c'est la solution que j'ai finalement proposée: http://jsfiddle.net/gabrielcatalin/cvyq0oys/

En bref, j'ai créé un module angulaire (décorateur), qui prend en charge 2 autres méthodes: résoudre () et prêt () . L'extrait d'angularenHancer doit simplement être chargé après la charge angulaire.js a chargé et avant la mise en œuvre, comme: xxx

Voici comment une implémentation sera la suivante: xxx

et le code HTML: xxx

espère voir des commentaires de vous les gars!


0 commentaires