AngularJS : ng-modèle de liaison n'a pas de mise à jour lorsqu'changé avec jQuery
C'est mon code HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Quand je tape dans la boîte, le modèle est mis à jour via le 2-way-mécanisme de liaison. Doux.
Cependant quand je le faire via JQuery...
$('#selectedDueDate').val(dateText);
Il ne met pas à jour le modèle. Pourquoi?
- Pourquoi voudriez-vous faire le second pour commencer ? Vous êtes à l'aide d'un cadre et ensuite décider de le contourner et de définir la valeur par le biais de manipulation du DOM. Meilleur conseil qu'on peut donner angulaire pour les débutants: oubliez jquery existe. dans 90% des cas angulaire suffira, et les 10% restants peuvent être atteints grâce à jqlite à l'intérieur d'une directive du lien (élément est en fait un jqlite enveloppé élément prêt à être manipulé).
- question très importante
- il y a de très bonnes raisons pour lesquelles vous pourriez vouloir changer angulaire des modèles avec de manipulation du dom, peut-être vous êtes un dev de travail avec Un a/B test de l'outil et veulent remplir les formulaires de derrière les scènes, ou si vous travaillez sur un script greasemonkey pour le remplissage automatique des formulaires.
Vous devez vous connecter pour publier un commentaire.
Angulaire ne sais pas à propos de ce changement. Pour cela, vous devez appeler
$scope.$digest()
ou de faire le changement à l'intérieur de$scope.$apply()
:Voir cette pour mieux comprendre sale vérification
Mise à JOUR: Ici est un exemple
function
$scope.$appliquer passage d'une fonction comme argument. Et $s'appliquent doivent être appel lorsque vous allez faire les changements sur $champ d'application, de sorte que, à l'intérieur de onSelect. Ah, je m'attends à ce que vous mettez de manipulation du DOM à l'intérieur de contrôleur juste pour l'exemple, dans une application réelle de ce qui est mal 😉datepicker="scopeKeyThatYouWant"
dans l'entréeSimplement utiliser;
trigger('input')
avec un datepicker dans sononSelect
événement. Il met à jour la valeur correctement..val('something'
appel à un$apply
(ou en appelant$digest
par la suite) n'a pas fonctionné.J'ai trouvé que si vous ne mettez pas la variable directement à l'encontre de la portée de la mise à jour de façon plus fiable.
Essayez d'utiliser certains "dateObj.selectedDate" et dans le contrôleur ajouter le selectedDate à un dateObj objet de la manière suivante:
Cela a fonctionné pour moi.
Essayer cette
Il suffit d'exécuter la ligne suivante à la fin de votre fonction:
$scope.$appliquer()
Tout ce qui se passe en dehors de la Portée Angulaire, Angulaire ne saura jamais qui.
Digérer cycle de mettre les changements à partir du modèle -> contrôleur de gestion, puis de contrôleur -> model.
Si vous avez besoin de voir le dernier Modèle, vous devez déclencher le digérer cycle
Mais il ya une chance de digérer le cycle en cours, donc nous avons besoin de vérifier et de l'init du cycle.
De préférence, toujours effectuer un coffre-fort appliquer.
AngularJS passer chaîne de caractères, les nombres et les booléens en valeur alors qu'il passe les tableaux et les objets par référence. Ainsi, vous pouvez créer un objet vide et faire de votre date d'une propriété de cet objet. De cette façon angulaire permettra de détecter des changements de modèle.
Dans le contrôleur
En html
Vous devez déclencher le événement de changement de de l'élément d'entrée parce que ng-modèle à l'écoute des événements d'entrée et le champ d'application sera mise à jour. Cependant, la régulière jQuery déclencheur ne fonctionne pas pour moi. Mais ici, c'est ce qui fonctionne comme un charme
Suivant ne fonctionne pas
Vous pouvez en lire plus à propos de la création et l'envoi synthétique des événements.
J'ai écrit ce petit plugin pour jQuery qui va faire tous les appels à
.val(value)
mise à jour de l'angulaire de l'élément s'il est présent:Il vous suffit d'insérer ce script dans l'après jQuery et angular.js et
val(value)
mises à jour doivent maintenant jouer à nice.Version minifiée:
Exemple:
JS:
HTML:
Cette réponse a été copié mot à mot de ma réponse à l'autre question similaire.
Suffit d'utiliser:
au lieu de: