IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

AngularJS Discussion :

Rootscope altéré / modifié


Sujet :

AngularJS

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Rootscope altéré / modifié
    Bonjour,

    J'ai un problème récurrent dans mon appli.
    J'illustre par un exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        promise.then(function (value) {
    		var data = value.data;
    		$rootScope.mvView = data.Info;
    		console.log($rootScope.mvView);
    		var listeAdr = $rootScope.mvView.ListeAdresse;
    		if (listeAdr.length > 0) {
    			console.log(listeAdr);
    			listeAdr.splice(0, 1);
    			console.log(listeAdr);
    		}
        });
    J'ai une promise, qui récupère des infos que je mets dans le rootscope (celui-ci est injecté dans d'autres controller, mais là ce n'est pas le sujet).
    J'instancie une variable JS dans laquelle je stocke un array d'adresse (3 éléments). Je supprime le premier élément de l'array de cette variable : ok
    Mais, ça l'a aussi supprimé dans le $rootScope.mvView.ListeAdresse.

    Il s'agit surement d'un manque de connaissance d'angularjs... Et évidemment c'est un problème qui devient extrêmement gênant, car il se reproduit souvent.

    Je ne comprends pas pourquoi, en modifiant une variable complètement indépendante, ça va me modifier le rootscope.
    Pour info, en plus du rootscope.mvView, j'ai aussi un rootScope.mvEdit, lui aussi modifié.

    Environnement :
    • AngularJS v1.4.4
    • Chrome 45


    Merci pour vos retours,

  2. #2
    Membre expérimenté Avatar de slim
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2002
    Messages
    938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2002
    Messages : 938
    Points : 1 337
    Points
    1 337
    Par défaut
    Citation Envoyé par konini Voir le message
    Mais, ça l'a aussi supprimé dans le $rootScope.mvView.ListeAdresse.

    Il s'agit surement d'un manque de connaissance d'angularjs...
    non, sorry mais c'est pas AngularJS mais de Javascript qu'il s'agit...
    Quand tu fais une affectation d'objet en javascript, celui-ci est passé par référence contrairement aux types primitifs (boolean, int, etc.).
    Donc si tu modifie l'objet initial, l'objet "copié" est aussi modifié.

    Par ailleurs, enregistrer des variables dans le $rootScope, c'est mal !

    Citation Envoyé par https://docs.angularjs.org/misc/faq
    $rootScope exists, but it can be used for evil
    Faites une recherche sur le forum et/ou sur internet et lisez la doc officielle avant de poser une question svp.
    et n'oubliez pas de lire les FAQ !
    FAQ Java et les cours et tutoriels Java
    Doc JAVA officielle
    AngularJS 1.x
    Angular 2

    Do it simple... and RTFM !

  3. #3
    Expert éminent sénior
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 413
    Points : 19 609
    Points
    19 609
    Par défaut
    Aucun rapport avec Angular, c'est du JavaScript pur.

    En JavaScript les variables sont des adresses de variables (comme en Java). Donc quand tu fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var listeAdr = $rootScope.mvView.ListeAdresse;
    Les deux variables (qui sont des références) pointent sur la même valeur en mémoire.

    Pour avoir deux valeurs en mémoire différentes il suffit de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var listeAdr = angular.copy($rootScope.mvView.ListeAdresse);
    EDIT : +1 pour le $rootScope.
    Un problème avec Git ? Essayez la FAQ, sinon posez votre question sur le forum.



    "Toute personne croyant qu'une croissance exponentielle peut durer indéfiniment dans un monde fini est soit un fou, soit un économiste."
    Kenneth E. Boulding

    "Les richesses naturelles sont inépuisables, car, sans cela, nous ne les obtiendrions pas gratuitement. Ne pouvant être ni multipliées ni épuisées, elles ne sont pas l’objet des sciences économiques."
    Jean-Baptiste Say, Traité d'économie politique, 1803.

    "/home/earth is 102% full ... please delete anyone you can."
    Inconnu

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2014
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Février 2014
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Hmmmm mais c'est quand même dingue que je n'ai jamais été confronté à ça ! Comme quoi, on apprend tous les jours, viva notre métier !
    Bien, je vais creuser.

    Pour le rootscope, j'ajoute la suite de la faq :
    $rootScope exists, but it can be used for evil
    Scopes in Angular form a hierarchy, prototypally inheriting from a root scope at the top of the tree. Usually this can be ignored, since most views have a controller, and therefore a scope, of their own.

    Occasionally there are pieces of data that you want to make global to the whole app. For these, you can inject $rootScope and set values on it like any other scope. Since the scopes inherit from the root scope, these values will be available to the expressions attached to directives like ng-show just like values on your local $scope.

    Of course, global state sucks and you should use $rootScope sparingly, like you would (hopefully) use with global variables in any language. In particular, don't use it for code, only data. If you're tempted to put a function on $rootScope, it's almost always better to put it in a service that can be injected where it's needed, and more easily tested.

    Conversely, don't create a service whose only purpose in life is to store and return bits of data.
    C'est exactement ce que je veux, des infos globales que je récupère dans chaque controller.
    Mais j'avais déjà atteint une limite à ça, et je pense que la notion de service va répondre à mon besoin.

    Merci pour vos retours, extrêmement rapide,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 27/11/2002, 14h08
  2. [VB6] Zone de liste modifiable basée sur un champ
    Par pepper dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 27/11/2002, 13h41
  3. [VB6] Modifier la clé d'un élément d'une collection
    Par Ricou13 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 21/11/2002, 14h49
  4. [VB6] [MDI] Modifier form en MDIform
    Par fikou dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 12/09/2002, 13h48
  5. Réponses: 5
    Dernier message: 06/08/2002, 20h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo