Voici le violon montrant le problème. http://jsfiddle.net/Erk4V/1/
Il apparaît que si j'ai un modèle ng à l'intérieur d'un ng-if, le modèle ne fonctionne pas comme prévu.
Je me demande s'il s'agit d'un bug ou si je ne comprends pas bien l'utilisation appropriée.
<div ng-app >
<div ng-controller="main">
Test A: {{testa}}<br />
Test B: {{testb}}<br />
Test C: {{testc}}<br />
<div>
testa (without ng-if): <input type="checkbox" ng-model="testa" />
</div>
<div ng-if="!testa">
testb (with ng-if): <input type="checkbox" ng-model="testb" />
</div>
<div ng-if="!someothervar">
testc (with ng-if): <input type="checkbox" ng-model="testc" />
</div>
</div>
</div>
controllerAs
?scope:false
et j'ai ajouté unng-if
élément autour de la directive - les étendues étaient initialement liées, mais elles se sont séparées après qu'un observateur a mis à jour l'une des valeurs de portée ...Réponses:
La
ng-if
directive, comme les autres directives, crée une portée enfant. Voir le script ci-dessous (ou ce jsfiddle )Ainsi, votre case à cocher modifie l'
testb
intérieur de la portée enfant, mais pas la portée parent externe.Notez que si vous souhaitez modifier les données dans la portée parent, vous devrez modifier les propriétés internes d'un objet comme dans la dernière div que j'ai ajoutée.
la source
$scope.obj = {...}
etng-model="obj.someProperty"
surmonte cette limitation.Vous pouvez utiliser
$parent
pour faire référence au modèle défini dans la portée parent comme cecila source
ng-model="$parent.$parent.foo
parce que je suis déjà dans une lunette avec unng-repeat
- est-ce vraiment la meilleure façon?Vous pouvez utiliser la directive ngHide (ou ngShow) . Il ne crée pas de portée enfant comme le fait ngIf.
la source
ngIf
alors une portée enfant? Cela me semble très étrange.ng-hide
ne change pas la structure html. Il change simplement les styles CSS.ng-if
est plus complexe: il supprime et insère des parties html selon l'état. Il crée une portée enfant pour stocker l'état (au moins, il doit stocker une partie html cachée).Nous l'avons eu dans de nombreux autres cas, ce que nous avons décidé en interne est de toujours avoir un wrapper pour le contrôleur / directive afin que nous n'ayons pas besoin d'y penser. Voici votre exemple avec notre wrapper.
J'espère que cela aide, Yishay
la source
Oui, la directive ng-hide (ou ng-show) ne créera pas de portée enfant.
Voici ma pratique:
http://jsfiddle.net/bn64Lrzu/
la source
Vous pouvez le faire comme ça et votre fonction de mod fonctionnera parfaitement, faites-moi savoir si vous voulez un stylo code
la source