30 votes

Partager une variable entre contrôleurs dans angular.js

Je suis nouveau dans angular et je me demande comment je peux partager une variable entre contrôleurs dans angular. J'utilise les scripts suivants -

Dans Main.js :

function MainCntl($scope) {
  ---code
}

function SearchCtrl($scope, $http) {
    $scope.url = 'http://10.0.0.13:9000/processAdHoc';
    $scope.errorM = "No results";     
    $scope.search = function() {

        $http.post($scope.url, { "data" : $scope.keywords}).
        success(function(data, status) {
            $scope.status = status;
            $scope.data = data;
            $scope.result = data; 
            alert('yes');
        })
        .
        error(function(data, status) {
            $scope.data = data || "Request failed";
            $scope.status = status;   
            alert('no');
            $scope.result = "failed";
        });
    };
}

Dans Index.html

<body ng-controller="MainCntl" >
---code
<div ng-controller="SearchCtrl">
     <form class="well form-search">
     <div class="ui-widget">
          <label for="tags"></label>
          <a ng-click="search()"><input type="image" src="../../images/search1.png" class="searchbox_submit" /></a>
          <input ng-model="keywords" placeholder="Shadow Search" id="tags" class="input-medium search-query rounded" /> 
     </div>
     </form>
</div>
---code
<p ng-model="result">
     {{result}}
</p>
</body>

Tout fonctionne bien avec l'ajax, j'envoie des données et je reçois une réponse, ma question est la suivante :

Dans la fonction SearchCtrl, j'ai une variable appelée $scope.result qui est ensuite mentionnée dans Index.html. Si j'insère le code html qui contient cette variable dans le contrôleur SearchCtrl, cela fonctionne bien, mais si je le place dans le contrôleur MainCtrl, cela ne fonctionne pas. Comment puis-je partager cette variable entre les contrôleurs ?

Merci d'avance

70voto

ShaiRez Points 3004

Utilisez un service et injectez-le dans les deux contrôleurs et faites référence à vos variables de portée à la variable services.

Exemple :

angular.module("yourAppName", []).factory("myService", function(){

  return {sharedObject: {data: null } }

});

function MainCtrl($scope, myService) {
  $scope.myVar = myService.sharedObject;
}

function SearchCtrl($scope, $http, myService) {
  $scope.myVar = myService.sharedObject;
}

Dans votre modèle, faites :

{{myVar.data}}

<a href="http://jsbin.com/ABUpOXA/1">See an example</a> Utilise Angular v1.1.5

La raison pour laquelle vous le placez dans un objet interne est de préserver vos références, si vous le gardez sans "sharedObject", et changez cet objet, votre liaison pointera vers l'ancienne référence et n'affichera rien dans le modèle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X