Ceci est mon HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Lorsque je tape dans la boîte, le modèle est mis à jour via le mécanisme de liaison bidirectionnelle. Doux.
Cependant, quand je fais cela via JQuery ...
$('#selectedDueDate').val(dateText);
Il ne met pas à jour le modèle. Pourquoi?
Réponses:
Angular n'est pas au courant de ce changement. Pour cela, vous devez appeler
$scope.$digest()
ou effectuer le changement à l'intérieur de$scope.$apply()
:Voir ceci pour mieux comprendre la vérification sale
MISE À JOUR : Voici un exemple
la source
function
$ scope. $ Apply en passant une fonction comme argument. Et $ apply devrait être appelé lorsque vous apporterez les modifications sur $ scope, donc à l'intérieur de onSelect. Ah, je m'attends à ce que vous mettiez la manipulation DOM à l'intérieur du contrôleur juste pour l'exemple, dans une vraie application, c'est faux;)datepicker="scopeKeyThatYouWant"
dans l'entréeUtilisez simplement;
la source
trigger('input')
avec un datepicker dans sononSelect
événement. Il met à jour correctement la valeur..val('something'
appel dans un$apply
(ou l'appel$digest
par la suite) ne fonctionnait pas.$('#selectedDueDate').val(dateText).trigger('change');
ce qui ne fonctionnait pas pour moi..trigger('input');
fonctionne comme la magieJ'ai trouvé que si vous ne mettez pas la variable directement dans la portée, elle se met à jour de manière plus fiable.
Essayez d'utiliser un "dateObj.selectedDate" et dans le contrôleur, ajoutez le selectedDate à un objet dateObj comme suit:
Cela a fonctionné pour moi.
la source
Essaye ça
la source
Exécutez simplement la ligne suivante à la fin de votre fonction:
$ scope. $ apply ()
la source
Quoi qu'il arrive en dehors de la portée d'Angular, Angular ne le saura jamais.
Le cycle de résumé met les modifications du modèle -> contrôleur, puis du contrôleur -> modèle.
Si vous avez besoin de voir le dernier modèle, vous devez déclencher le cycle de résumé
Mais il y a une chance qu'un cycle de digestion soit en cours, nous devons donc vérifier et lancer le cycle.
De préférence, effectuez toujours une application en toute sécurité.
la source
AngularJS transmet la chaîne, les nombres et les booléens par valeur pendant qu'il transmet les tableaux et les objets par référence. Vous pouvez donc créer un objet vide et faire de votre date une propriété de cet objet. De cette façon, angular détectera les changements de modèle.
Dans le contrôleur
En html
la source
Vous devez déclencher l' événement de modification de l'élément d'entrée car ng-model écoute les événements d'entrée et la portée sera mise à jour. Cependant, le déclencheur jQuery régulier ne fonctionnait pas pour moi. Mais voici ce qui fonctionne comme un charme
Le suivi n'a pas fonctionné
Vous pouvez en savoir plus sur la création et la distribution d'événements synthétiques .
la source
J'ai écrit ce petit plugin pour jQuery qui fera tous les appels pour
.val(value)
mettre à jour l'élément angulaire s'il est présent:Insérez simplement ce script après jQuery et angular.js et les
val(value)
mises à jour devraient maintenant fonctionner correctement .Version réduite:
Exemple:
Afficher l'extrait de code
Cette réponse a été copiée textuellement de ma réponse à une autre question similaire .
la source
Utilisez simplement:
au lieu de:
la source