J'ai cette repro http://embed.plnkr.co/nVCmukG5abpi1Y4ZHkrq qui s'affiche lorsque je clique sur 'Title3' et saisis une valeur dans la zone de texte bien que la valeur entrée s'affiche reflétée dans l'interface utilisateur, lorsque je clique sur le bouton "cliquer" rien n'est lié pour l'attribut de portée $ scope.test.
Je ne sais pas ce qui ne va pas avec ng-switch ou peut-être que je fais quelque chose de mal. L'aide est appréciée !!!
Il s'agit d'un problème d'héritage de portée dû à ng-switch
créant sa propre portée.
Une recommandation souvent faite est toujours d'utiliser un dot
sur les modèles. La raison en est que lorsque l'élément d'étendue du contrôleur est un objet et non une primitive, les sous-étendues créent une référence à l'objet initial. Si le modèle est une primitive, il ne mettra pas à jour l'original.
Par exemple:
<input ng-model="test.value" placeholder="pre" type="text" />
$scope.test={value:''}
Une autre approche consiste à utiliser $parent
dans le balisage du modèle html:
<input ng-model="$parent.test" placeholder="pre" type="text" />
L'utilisation de la méthodologie dot
est une bonne pratique pour éviter ces problèmes car vous n'avez pas besoin de penser à des étendues imbriquées plus profondes.
Démo utilisant test.value
comme modèle: http://plnkr.co/edit/CkiF55bLXsYzR6ZjcrJp?p=preview
Référence concernant dot
dans les modèles (lecture précieuse): https://github.com/angular/angular.js/wiki/Understanding-Scopes
C'est parce que vous créez en fait une portée enfant à l'intérieur du ng-switch. Une autre propriété test
existe donc sur une étendue appartenant à la directive ngSwitch. Il affichera initialement la valeur de sa portée parent, mais lorsque vous le modifiez, car il s'agit d'une primitive, il ne modifie que la valeur sur l'enfant, pas sur le parent. L'héritage prototypique n'entre pas en jeu ici (mais c'est ce dont nous avons besoin).
Lorsque vous cliquez sur le bouton, le bouton alerte/console.logging la propriété sur la portée parent ... que l'enfant ne peut pas modifier.
Pour résoudre ce problème, utilisez $parent.test
sur votre attribut ng-model dans votre ngSwitch:
un extrait:
<span class="pew" ng-switch-when="title2">
<input ng-model="$parent.test" placeholder="pre" type="text" />
{{test}}
</span>
Et voici une fourchette de votre plongeur le montrant en action.
J'ai rencontré un problème similaire et je l'ai résolu en créant une variable d'étendue dans le contrôleur et en l'utilisant avec dans ng-include
et ng-switch
. De cette façon, si vous avez profondément imbriqué ng-include
est avec dans ng-switch
et cela continue, nous pouvons toujours utiliser directement cette variable de portée.
Comme toutes les étendues enfant (ici, ng-include
/ng-switch
) s'étend de la portée parent (généralement, la portée des contrôleurs), nous pouvons accéder directement à la portée parent à partir de avec dans ces étendues enfants sans problème.
En utilisant $parent
nécessitera d'écrire comme $parent.$parent.$parent.someProp
Exemple Plunk:http://plnkr.co/edit/8UGH7nUpFmATiXfkYSwr?p=preview