Eu tenho esse cenário simples:
Elemento de entrada cujo valor é alterado pelo método val () do jQuery.
Estou tentando atualizar o modelo angular com o valor que o jQuery define. Eu tentei escrever uma diretiva simples, mas não está fazendo o que eu quero.
Aqui está a diretiva:
var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
return function(scope, element, attrs) {
element.bind('change', function() {
console.log('value changed');
})
}
})
esta é a parte do jQuery:
$(function(){
$('button').click(function(){
$('input').val('xxx');
})
})
e html:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
</div>
</div>
<button>clickme</button>
Aqui está o violino com a minha tentativa:
http://jsfiddle.net/U3pVM/743/
Alguém pode, por favor, apontar a direção certa?
Respostas:
O ngModel escuta o evento "input"; portanto, para "consertar" seu código, você precisará acionar esse evento após definir o valor:
Para a explicação desse comportamento específico, verifique esta resposta que eu dei há um tempo: " Como o AngularJS captura internamente eventos como 'onclick', 'onchange'? "
Mas, infelizmente, este não é o único problema que você tem. Como apontado em outros comentários, sua abordagem centrada no jQuery está totalmente errada. Para obter mais informações, dê uma olhada neste post: Como eu “penso no AngularJS” se tenho um background em jQuery? )
fonte
input
evento não funciona no IE, incluindo o IE11.input
O evento funciona apenas quando$sniff.hasEvent('input')
é verdadeiro, mas$sniff.hasEvent('input')
é falso mesmo no IE11! Em vez disso, podemos usar ochange
evento .Espero que isso seja útil para alguém.
Não foi possível obter o
jQuery('#myInputElement').trigger('input')
evento para meu aplicativo angular.Eu era capaz
angular.element(jQuery('#myInputElement')).triggerHandler('input')
de ser apanhada.fonte
angular.element($('#myInputElement')).triggerHandler('input')
A resposta aceita que estava acionando o
input
evento com o jQuery não funcionou para mim. Criar um evento e despachar com JavaScript nativo fez o truque.fonte
Eu não acho que o jQuery seja necessário aqui.
Você pode usar $ relógio e ng clique com o botão em vez
No seu controlador:
fonte
É necessário usar o código a seguir para atualizar o escopo do modelo de entrada específico da seguinte maneira
fonte
var scope = angular.element($("select")).scope(); scope.$apply(function(){ scope.selectValue = newVal; });
essa parte me ajudou muito. Meu problema foi atualizar um modelo angular após uma chamada de jquery ajax na função success. Foi lento com $ http porque havia um ouvinte de evento de alteração duplicado para o elemento que estava fazendo outra coisa, então eu o mesclei no jQuery.$compileProvider.debugInfoEnabled(false);
ou$logProvider.debugEnabled(false);
Consulte code.angularjs.org/1.4.0/docs/guide/production para obter mais informações.Fiz modificações apenas na inicialização do controlador adicionando listener no botão de ação:
Outras soluções não funcionaram no meu caso.
fonte
Eu sei que é um pouco tarde para responder aqui, mas talvez eu possa economizar algumas vezes por dia.
Eu tenho lidado com o mesmo problema. Um modelo não será preenchido depois que você atualizar o valor da entrada do jQuery. Eu tentei usar eventos de gatilho, mas nenhum resultado.
Aqui está o que eu fiz que pode salvar seu dia.
Declare uma variável na sua tag de script em HTML.
Gostar:
Uma vez você fez isso usando o serviço abaixo de angular.
Agora, abaixo da função getData chamada do mesmo escopo do controlador, você terá o valor que deseja.
fonte
Eu escrevi este pequeno plugin para jQuery, que fará todas as chamadas para
.val(value)
atualizar o elemento angular, se presente:Basta inserir esse script depois do jQuery e do angular.js e as
val(value)
atualizações agora devem ser boas.Versão reduzida:
Exemplo:
Mostrar snippet de código
fonte
Se você estiver usando o IE, precisará usar: input.trigger ("change");
fonte
adicione
.change()
depois de definir o valor.exemplo:
('id').val.('value').change();
também não se esqueça de adicionar
onchange
oung-change
marcar em htmlfonte
Eu fiz isso para poder atualizar o valor de ngModel de fora com Vanilla / jQuery:
fonte