Question probablement idiote, mais j'ai mon formulaire html avec une simple entrée et un bouton:
<input type="text" ng-model="searchText" />
<button ng-click="check()">Check!</button>
{{ searchText }}
Puis dans le contrôleur (le modèle et le contrôleur sont appelés depuis routeProvider):
$scope.check = function () {
console.log($scope.searchText);
}
Pourquoi la vue est-elle mise à jour correctement mais non définie dans la console lorsque je clique sur le bouton?
Merci!
Mise à jour: On dirait que j'ai réellement résolu ce problème (avant j'ai dû trouver des solutions) avec: Je n'ai eu qu'à changer le nom de ma propriété de searchText
à search.text
, puis définir un $scope.search = {};
objet vide dans le contrôleur et le tour est joué ... Je ne sais pas pourquoi cela fonctionne bien que ;]
javascript
angularjs
data-binding
angular-ngmodel
alchimisation
la source
la source
searchText
ensearch.text
, aucune idée pourquoi?voila
, nonvuala
,wolla
etc.Réponses:
Contrôleur comme version (recommandé)
Voici le modèle
Le JS
Un exemple: http://codepen.io/Damax/pen/rjawoO
Le mieux sera d'utiliser un composant avec Angular 2.x ou Angular 1.5 ou supérieur
########À l'ancienne (NON recommandé)
Ceci n'est PAS recommandé car une chaîne est une primitive, il est fortement recommandé d'utiliser un objet à la place
Essayez ceci dans votre balisage
et cela dans votre manette
la source
searchText
?"Si vous utilisez ng-model, vous devez avoir un point dedans."
Faites pointer votre modèle vers une propriété object.property et vous serez prêt à partir.
Manette
Modèle
Cela se produit lorsque des étendues enfants sont en jeu - comme des routes enfants ou des répétitions ng. La portée enfant crée sa propre valeur et un conflit de nom naît comme illustré ici :
Voir ce clip vidéo pour plus: https://www.youtube.com/watch?v=SBwoFkRjZvE&t=3m15s
la source
Dans Mastering Web Application Development with AngularJS book p.19, il est écrit que
Les étendues ne sont que des objets JavaScript et imitent la hiérarchie dom. Selon l' héritage du prototype JavaScript , les propriétés des étendues sont séparées par des étendues. Pour éviter cela, la notation par points doit utiliser pour lier les modèles ng.
la source
Utilisation
this
au lieu de$scope
travaux.Edit: Au moment d'écrire cette réponse, j'avais une situation beaucoup plus compliquée que cela. Après les commentaires, j'ai essayé de le reproduire pour comprendre pourquoi ça marche, mais pas de chance. Je pense
this
qu'en quelque sorte (je ne sais pas vraiment pourquoi) une nouvelle portée enfant est générée et fait référence à cette portée. Mais s'il$scope
est utilisé, il fait référence à la portée $ parent en raison de la fonctionnalité de portée lexicale de javascript .Ce serait génial si quelqu'un ayant ce problème testait de cette façon et nous en informer.
la source
$scope
créent une nouvelle portée (c'est-à-dire que dans la fonctioncheck()
, sethis
réfère à une portée qui est une portée enfant$scope
). Pourquoi en est-il ainsi? Pouvez-vous donner quelques explications?this.searchText = "something else"
ou même si$scope.searchText = "something else"
cela ne met pas à jour la vue. pouvez-vous expliquer ce problème?J'ai eu le même problème et c'est parce que je n'ai pas déclaré l'objet vide en premier en haut de mon contrôleur:
J'espère que cela fonctionnera pour vous!
la source
Je suis tombé sur le même problème lorsqu'il s'agissait d'une vue non triviale (il existe des étendues imbriquées). Et finalement découvert que c'est une chose connue et délicate lors du développement d'une application AngularJS en raison de la nature de l'héritage basé sur prototype de java-script. Les portées imbriquées AngularJS sont créées via ce mécanisme. Et la valeur créée à partir de ng-model est placée dans la portée des enfants, sans dire que la portée parent (peut-être celle injectée dans le contrôleur) ne verra pas la valeur, la valeur masquera également toute propriété avec le même nom défini dans la portée parent si elle n'utilise pas dot pour appliquer un accès de référence au prototype. Pour plus de détails, consultez la vidéo en ligne spécifique pour illustrer ce problème, http://egghead.io/video/angularjs-the-dot/ et les commentaires qui en découlent.
la source
Jetez un oeil à ce violon http://jsfiddle.net/ganarajpr/MSjqL/
J'ai (je suppose!) Fait exactement ce que vous faisiez et cela semble fonctionner. Pouvez-vous vérifier ce qui ne fonctionne pas ici pour vous?
la source
Comme personne ne l'a mentionné, le problème peut être résolu en ajoutant
$parent
à la propriété liéeEt le contrôleur
la source
Pour moi, le problème a été résolu en stockant mes données dans un objet (ici "données").
J'espère que ça va aider
la source
Je viens d'avoir ce problème avec un root_controller lié à l'élément body. Ensuite, j'utilisais ng-view avec le routeur angulaire. Le problème est qu'angular crée TOUJOURS une nouvelle portée quand il insère le html dans l'élément ng-view. En conséquence, ma fonction "check" a été définie sur la portée parent de la portée qui a été modifiée par mon élément ng-model.
Pour résoudre le problème, utilisez simplement un contrôleur dédié dans le contenu html chargé par route.
la source
Vous pouvez le faire pour activer la recherche en
ng-keypress
entrée pour le texte d'entrée et enng-click
pour l'icône:la source
J'ai eu le même problème.
La bonne façon serait de définir le «searchText» pour être une propriété à l'intérieur d'un objet.
Mais si je veux le laisser tel quel, une chaîne? eh bien, j'ai essayé toutes les méthodes mentionnées ici, rien n'a fonctionné.
Mais ensuite, j'ai remarqué que le problème ne concerne que l'initiation, donc je viens de définir l'attribut value et cela a fonctionné.
De cette façon, la valeur est simplement définie sur la valeur '$ scope.searchText' et elle est mise à jour lorsque la valeur d'entrée change.
Je sais que c'est une solution de contournement, mais cela a fonctionné pour moi ..
la source
J'étais confronté au même problème ... La résolution qui a fonctionné pour moi est d'utiliser ce mot-clé ..........
alerte (this.ModelName);
la source