J'ai une page avec plusieurs contrôleurs, l'un des contrôleurs est utilisé dans 2 div différents dans la même page. Je ne sais pas si c'est une question de portée ou si je manque quelque chose dans mon code.
voici le plunkr http://plnkr.co/edit/IowesXE3ag6xOYfB6KrN?p=preview
Je souhaite masquer la zone de texte lorsque l'utilisateur clique sur le lien "Économies", affiche la boîte en cliquant sur le lien "Coût".
Chaque fois que vous utilisez ng-controller, vous créez une nouvelle instance dudit contrôleur, avec sa propre portée. Si vous définissez subCCtrl sur la balise body (ou un nouveau parent) et que vous la supprimez des deux divs sur lesquels elle se trouve, cela fonctionne pour moi.
Vous pouvez également rechercher d'autres solutions en conservant "hideThisBox" sur l'étendue racine, en diffusant un événement en cliquant sur Enregistrer ou en le conservant dans un service.
Même contrôleur, mais déclaré deux fois. donc - deux portées.
Normalement, la solution consiste à déplacer la déclaration du contrôleur ng d'un niveau dom supérieur (dans votre cas, dans l'élément body. Une fois uniquement), et de ne l'avoir qu'une fois. Sinon, examinez les services angulaires.
voir plunkr mis à jour: http://plnkr.co/edit/pWnx2mdMeOeH33LUeTGm?p=preview
Vous devez apporter quelques modifications au contrôleur et à la vue.
var app = angular.module('plunker', []);
app.controller('subCCtrl', function($scope) {
$scope.hideThisBox = false;
$scope.update = function(label) {
if (label == 'Cost')
$scope.displaybox = true;
else
$scope.displaybox = false;
}
});
app.controller('subACtrl', function($scope) {
});
app.controller('subBCtrl', function($scope) {
});
HTML:
<!DOCTYPE html>
<html ng-app="plunker">
<head>
<meta charset="utf-8" />
<title>AngularJS Plunker</title>
<script>document.write('<base href="' + document.location + '" />');</script>
<link rel="stylesheet" href="style.css" />
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<script src="http://code.jquery.com/jquery-1.9.1.js"></script>
<script src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
<script data-require="[email protected]" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.8/angular.min.js" data-semver="1.0.8"></script>
<script src="app.js"></script>
</head>
<body>
<div ng-controller="subCCtrl" class="row-fluid">
<div class="span6">
<a href="#" ng-click='update("Cost");displaybox=true;'>Cost</a>
<br />
<a href="#" ng-click='update("Savings");displaybox=fasle;'>Savings</a>
<br />
</div>
<hr />
<div ng-controller="subACtrl">Do stuff that uses subACtrl</div>
<div ng-controller="subBCtrl">Do stuff that uses subBCtrl</div>
<hr />
<div ng-controller="subCCtrl" class="row-fluid">
<div class="span3">
<label>If click on 'Savings', hide below box: </label>
</div>
<div ng-hide="hideThisBox" class="span6">
<input type="text" ng-model="test2" ng-show="displaybox"/>
</div>
</div>
</div>
</body>
</html>
Vous avez déjà reçu votre réponse, je suppose, mais pour ceux qui viendront après, voici quelques astuces ^^ (espérons que ça ira):
ng-controller="myCtrl"
définira une nouvelle instance du contrôleur "myCtrl", avec sa propre portée
La portée utilisée sera celle du contrôleur de la première div. Cela signifie que si vous avez quelque chose comme:
<div id="maindiv" ng-controller="myCtrl> <div id="subdiv1"> <div></div> <div> <div>some text</div> </div> </div> <div id="subdiv2" ng-controller="myCtrl"> <div> <span>-</span> <span>so</span> <span>this</span> <span>is</span> <span>a</span> <span>subdiv</span> <span>.</span> </div> </div> </div> </div>
C’est juste quelques astuces simples et vous en trouverez d’autres plus utiles sur SO, ou google, mais de toute façon, si cela peut aider certains d’entre vous, ce sera cool.
Je vous recommande de lire sur Javascript. Le problème avec votre code était la portée de ng-controllers
.