J'ai ce scénario simple:
Élément d'entrée dont la valeur est modifiée par la méthode val () de jQuery.
J'essaie de mettre à jour le modèle angulaire avec la valeur définie par jQuery. J'ai essayé d'écrire une directive simple, mais ça ne fait pas ce que je veux.
Voici la directive:
var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
return function(scope, element, attrs) {
element.bind('change', function() {
console.log('value changed');
})
}
})
c'est la partie jQuery:
$(function(){
$('button').click(function(){
$('input').val('xxx');
})
})
et html:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
</div>
</div>
<button>clickme</button>
Voici le violon avec mon essai:
http://jsfiddle.net/U3pVM/743/
Quelqu'un peut-il s'il vous plaît me diriger dans la bonne direction?
Réponses:
ngModel écoute l'événement "input", donc pour "corriger" votre code, vous devez déclencher cet événement après avoir défini la valeur:
Pour l'explication de ce comportement particulier, consultez cette réponse que j'ai donnée il y a quelque temps: " Comment AngularJS intercepte-t-il en interne des événements tels que 'onclick', 'onchange'? "
Mais malheureusement, ce n'est pas le seul problème que vous rencontrez. Comme indiqué dans d'autres commentaires, votre approche centrée sur jQuery est tout simplement fausse. Pour plus d'informations, jetez un œil à cet article: Comment est-ce que je "pense dans AngularJS" si j'ai un arrière-plan jQuery? ).
la source
input
événement ne fonctionne pas sur IE, y compris IE11.input
L'événement ne fonctionne que quand$sniff.hasEvent('input')
est vrai mais$sniff.hasEvent('input')
est faux même sur IE11! Nous pouvons utiliser l'change
événement à la place.J'espère que cela est utile pour quelqu'un.
Je n'ai pas pu récupérer l'
jQuery('#myInputElement').trigger('input')
événement dans mon application angulaire.J'ai cependant pu
angular.element(jQuery('#myInputElement')).triggerHandler('input')
être pris en charge.la source
angular.element($('#myInputElement')).triggerHandler('input')
La réponse acceptée qui déclenchait un
input
événement avec jQuery ne fonctionnait pas pour moi. La création d'un événement et l'envoi avec JavaScript natif ont fait l'affaire.la source
Je ne pense pas que jQuery soit nécessaire ici.
Vous pouvez utiliser $ watch et ng-click à la place
Dans votre contrôleur:
la source
Vous devez utiliser le code suivant pour mettre à jour la portée du modèle d'entrée spécifique comme suit
la source
var scope = angular.element($("select")).scope(); scope.$apply(function(){ scope.selectValue = newVal; });
cette portion m'a beaucoup aidé. Mon problème était de mettre à jour un modèle angulaire après un appel jquery ajax dans la fonction success. C'était lent avec $ http car il y avait un écouteur d'événement de changement en double pour l'élément qui faisait autre chose, alors je l'ai fusionné dans jQuery.$compileProvider.debugInfoEnabled(false);
ou$logProvider.debugEnabled(false);
Voir code.angularjs.org/1.4.0/docs/guide/production pour plus d'informations.J'ai apporté des modifications uniquement à l'initialisation du contrôleur en ajoutant un écouteur sur le bouton d'action:
D'autres solutions n'ont pas fonctionné dans mon cas.
la source
Je sais qu'il est un peu tard pour répondre ici, mais je pourrais peut-être en sauver une fois.
J'ai été confronté au même problème. Un modèle ne se remplira pas une fois que vous aurez mis à jour la valeur d'entrée de jQuery. J'ai essayé d'utiliser des événements déclencheurs mais aucun résultat.
Voici ce que j'ai fait pour vous sauver la vie.
Déclarez une variable dans votre balise de script en HTML.
Comme:
Une fois que vous avez fait cela en utilisant le service ci-dessous d'angular.
Maintenant, ci-dessous, la fonction getData appelée à partir de la même portée de contrôleur vous donnera la valeur souhaitée.
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
la source
Si vous utilisez IE, vous devez utiliser: input.trigger ("change");
la source
ajouter
.change()
après avoir défini la valeur.exemple:
('id').val.('value').change();
n'oubliez pas non plus d'ajouter
onchange
ou deng-change
taguer en htmlla source
J'ai fait cela pour pouvoir mettre à jour la valeur de ngModel de l'extérieur avec Vanilla / jQuery:
la source