Le comportement de la cession d'expression invoquée par ng-cliquez à l'intérieur de ng-repeat
Je suis tenté de mettre à jour mon modèle à l'aide de ng-click
attaché à un <p>
.
Je n'ai pas de problème avec une expression d'affectation à l'extérieur d'un ng-repeat
, ou avec l'appel de la portée de la méthode à l'intérieur de la ng-repeat
. Cependant, si j'utilise une cession à l'intérieur de la ng-repeat
, il semble être ignorée. Je ne vois pas tous les messages signalés dans le Firefox de la console, mais je n'ai pas essayé de définir des points d'arrêt pour voir si l'événement est déclenché.
<!DOCTYPE html>
<html>
<head>
<title>Test of ng-click</title>
<script type='text/javascript' src='http://code.angularjs.org/1.1.1/angular.js'></script>
<script type='text/javascript'>//<![CDATA[
function MyCtrl($scope) {
$scope.selected = "";
$scope.defaultValue = "test";
$scope.values = ["foo", "bar", "baz"];
$scope.doSelect = function(val) {
$scope.selected = val;
}
}
//]]>
</script>
</head>
<body ng-app>
<div ng-controller='MyCtrl'>
<p>Selected = {{selected}}</p>
<hr/>
<p ng-click='selected = defaultValue'>Click me</p>
<hr/>
<p ng-repeat='value in values' ng-click='selected = value'>{{value}}</p>
<hr/>
<p ng-repeat='value in values' ng-click='doSelect(value)'>{{value}}</p>
</div>
</body>
</html>
Violon est ici, si vous préférez (avec un couple de plus tôt variantes).
Vous devez vous connecter pour publier un commentaire.
Directive ngRepeat crée un nouveau champ d'application pour chaque itération, de sorte que vous besoin de faire référence à des variables dans la portée parent.
Utilisation
$parent.selected = value
, comme dans:Remarque: appel d'une Fonction se propage en raison de prototypes à l'héritage.
Si vous voulez en savoir plus: Les Nuances de Portée Prototypes Héritage.
Comme @Stewie mentionné, $parent est une façon de résoudre ce problème. Cependant, le recommandé (par l'Angulaire de l'équipe) la solution est de ne pas définir des primitives propriétés sur le $scope. Plutôt, l' $champ d'application devrait référence de votre modèle. À l'aide de références permet également d'éviter le problème (parce que les peuples primitifs propriétés ne seront pas créés sur l'enfant étendues qui/masquer l'ombre de la portée parent propriétés du même nom), et vous n'avez pas à se rappeler lors de l'utilisation de $parent:
HTML:
JavaScript:
Violon.
J'ai récemment mis à jour la page du wiki que @Stewie mentionné recommandons toujours de cette approche.
ng-show
et autres).