Tengo este escenario simple:
Elemento de entrada cuyo valor cambia mediante el método val () de jQuery.
Estoy tratando de actualizar el modelo angular con el valor que estableció jQuery. Traté de escribir una directiva simple, pero no está haciendo lo que quiero.
Aquí está la directiva:
var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
return function(scope, element, attrs) {
element.bind('change', function() {
console.log('value changed');
})
}
})
Esta es la parte de jQuery:
$(function(){
$('button').click(function(){
$('input').val('xxx');
})
})
y html:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
</div>
</div>
<button>clickme</button>
Aquí está el violín con mi intento:
http://jsfiddle.net/U3pVM/743/
¿Puede alguien indicarme el camino correcto?
Respuestas:
ngModel escucha el evento "input", por lo que para "arreglar" su código necesitaría activar ese evento después de establecer el valor:
Para la explicación de este comportamiento en particular, consulte esta respuesta que le di hace un tiempo: " ¿Cómo AngularJS captura internamente eventos como 'onclick', 'onchange'? "
Pero desafortunadamente, este no es el único problema que tiene. Como se señaló con otros comentarios de publicaciones, su enfoque centrado en jQuery es simplemente incorrecto. Para obtener más información, eche un vistazo a esta publicación: ¿Cómo “pienso en AngularJS” si tengo antecedentes de jQuery? )
fuente
input
evento no funciona en IE, incluido IE11.input
¡El evento funciona solo cuando$sniff.hasEvent('input')
es verdadero pero$sniff.hasEvent('input')
es falso incluso en IE11! Podemos usarchange
evento en su lugar.Espero que esto sea útil para alguien.
No pude obtener el
jQuery('#myInputElement').trigger('input')
evento para recoger mi aplicación angular.Sin embargo, pude llegar
angular.element(jQuery('#myInputElement')).triggerHandler('input')
a ser recogido.fuente
angular.element($('#myInputElement')).triggerHandler('input')
La respuesta aceptada que desencadenaba un
input
evento con jQuery no funcionó para mí. Crear un evento y enviarlo con JavaScript nativo fue el truco.fuente
No creo que se requiera jQuery aquí.
Puede usar $ watch y ng-click en su lugar
En tu controlador:
fuente
Debe usar el siguiente código para actualizar el alcance del modelo de entrada específico de la siguiente manera
fuente
var scope = angular.element($("select")).scope(); scope.$apply(function(){ scope.selectValue = newVal; });
esa porción me ayudó mucho. Mi problema fue actualizar un modelo angular después de una llamada jquery ajax en la función de éxito. Era lento con $ http porque había un detector de eventos de cambio duplicado para el elemento que estaba haciendo otra cosa, así que lo fusioné en jQuery.$compileProvider.debugInfoEnabled(false);
o$logProvider.debugEnabled(false);
ver code.angularjs.org/1.4.0/docs/guide/production para obtener más información.Hice modificaciones solo en la inicialización del controlador agregando oyente en el botón de acción:
Otras soluciones no funcionaron en mi caso.
fuente
Sé que es un poco tarde para responder aquí, pero tal vez pueda ahorrar un día.
He estado lidiando con el mismo problema. Un modelo no se completará una vez que actualice el valor de entrada de jQuery. Intenté usar eventos desencadenantes pero ningún resultado.
Esto es lo que hice que puede salvar tu día.
Declare una variable dentro de su etiqueta de script en HTML.
Me gusta:
Una vez que hiciste eso usando el siguiente servicio de angular.
Ahora debajo de la función getData llamada desde el mismo alcance del controlador le dará el valor que desea.
fuente
He escrito este pequeño complemento para jQuery que hará todas las llamadas para
.val(value)
actualizar el elemento angular si está presente:Simplemente ingrese este script después de jQuery y angular.js y
val(value)
actualizaciones ahora deberían funcionar bien.Versión minimizada:
Ejemplo:
Mostrar fragmento de código
fuente
Si está utilizando IE, debe usar: input.trigger ("cambio");
fuente
añadir
.change()
después de establecer el valor.ejemplo:
('id').val.('value').change();
tampoco olvides agregar
onchange
ong-change
etiquetar en htmlfuente
Hice esto para poder actualizar el valor de ngModel desde el exterior con Vanilla / jQuery:
fuente