-1
votes

Async variable stockée en $ rootscope non disponible dans d'autres contrôleurs

J'utilise angulaire 1.x angulaire fort> pour ma pile et lorsque je fais un appel API et stocke la réponse dans le $ rootscope code>, il n'est pas accessible dans d'autres contrôleurs 'Vue.

Mon contrôleur: P>

<div ng-if="userLoggedIn" class="py-1 pl-1 pr-1">
  <span><b>Message Board</b></span>
  <div class="form-control" readonly id="lockTextbox">Show something</div>
</div>


1 commentaires

Ce code ne reproduit pas le problème. En tant que tel II n'est pas utile pour les autres lecteurs. Veuillez modifier la question pour inclure un exemple de reproductible minimal .


3 Réponses :


1
votes

OK, pour résoudre le problème du chronométrage, je retrouve complètement la réponse. Cela devrait être un exemple rapide et sale mais - Exemple de travail:

index.html h2>

p> xxx pré>

script.js h2>
hello 
get 
Success 


6 commentaires

Je viens de lui donner un aller et ça ne marche toujours pas. En fait, il y a un endroit dans le même contrôleur où j'utilise la variable $ rootscope.userloggedin dans la vue et que cela ne fonctionne pas non plus (vient de voir cela). Ce qui est vraiment étrange, c'est quand j'ouvre la console de débogage dans le navigateur, ça marche! Qu'est-ce qui se passe ici? Semble certainement être un problème d'asynchronisation ...


D'après ce que j'ai compris maintenant, je vérifierais si votre vue trouve la bonne portée. Qui a quitté une douleur en angulaire.js. Je collerai des extraits de code ci-dessus ...


Merci. J'ai ajouté que dans comme vous l'avez dit et cela montre juste aussi faux. Quand je ne l'initialise pas, cela ne montre pas le sens de la variable n'existe pas et semble donc une question de synchronisation. Je pensais que Angular s'occupait de ça par design? Aucune suggestion?


Se souvenir du bon vieux angulaire.js;) J'essaierais d'éviter complètement la portée et de joindre la variable à votre contrôleur: contrôleur self.userloggedin = true et modèle: ng-show = " $ ctrl.userloggedin ").


J'en ai besoin de moins de $ Rootscope, car j'en ai besoin de cette variable dans d'autres contrôleurs, mais je l'ai donné d'aller au moins voir si cela fonctionnera. Vous ne le croirez pas, ce n'est pas le cas. $ ctrl.userloggedin n'est même pas même montrant quand je l'enregistre comme Self.UserLoggedin = true


Manuellement sauvé cela comme vrai juste pour vérifier les défauts évidents et cela fonctionne. Donc, c'est juste un problème de synchronisation. Je ne peux tout simplement pas craquer celui-ci.



1
votes

Exemple de travail

La démo ci-dessous montre la variable $ Rootscope disponible dans les deux contrôleurs après avoir été définie d'une promesse retardée de deux secondes. p>

p>

<script src="//unpkg.com/angular/angular.js"></script>
<body ng-app="app">
  <fieldset ng-controller="mainController">
     MAIN Controller userLoggedIn={{userLoggedIn}}<br>
     <div ng-if="userLoggedIn">
        Message Board - Show something
     </div>
  </fieldset>
  <fieldset ng-controller="otherController">
     OTHER Controller userLoggedIn={{userLoggedIn}}
     <div ng-if="userLoggedIn">
        Message Board - Show something
     </div>
  </fieldset>
</body>


3 commentaires

Oui et merci mais vous avez ajouté un retard. Cela défait tout le but que j'ai peur.


Le retard simule le retard qu'une requête HTTP prendrait avant de définir la variable $ Rootscope. Ce code démontre que les variables en $ Rootscope set asynchroniquement afficheront dans le gabarit de tous les contrôleurs, pas seulement du contrôleur qui reçoit le XHR.


Merci mate mais cela n'a pas fonctionné pour moi. Je sais que c'est censé travailler mais ce n'est pas le cas. J'ai enfin trouvé la solution ...... mises à jour angulaires de 1,6,4 à 1,7,9. Ça l'a fait. Très frustrant lorsque la réponse était si évidente et cela me manque entièrement.



0
votes

J'ai trouvé le problème. J'ai mis à jour mon angulaire de 1,6,4 à 1,7,9 (et tous les modules comme angular-sanitize, etc.), et qui a fait l'affaire. Aurait dû être la première chose que j'ai faite mais j'ai manqué entièrement


0 commentaires