Este é o meu HTML:
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
Quando digito na caixa, o modelo é atualizado por meio do mecanismo de ligação bidirecional. Doce.
No entanto, quando faço isso via JQuery ...
$('#selectedDueDate').val(dateText);
Não atualiza o modelo. Por quê?
Respostas:
Angular não sabe dessa mudança. Para isso, você deve ligar
$scope.$digest()
ou fazer a alteração dentro de$scope.$apply()
:Veja isto para entender melhor a verificação suja
ATUALIZAÇÃO : Aqui está um exemplo
fonte
function
$ scope. $ Apply passando uma função como argumento. E $ apply deve ser chamado quando você fizer as alterações em $ scope, portanto, dentro de onSelect. Ah, espero que você coloque a manipulação do DOM dentro do controlador apenas para o exemplo, em um aplicativo real isso está errado;)datepicker="scopeKeyThatYouWant"
na entradaApenas use;
fonte
trigger('input')
com um selecionador de data em seuonSelect
evento. Ele atualiza o valor corretamente..val('something'
chamada em um$apply
(ou chamar$digest
depois) não funcionou.$('#selectedDueDate').val(dateText).trigger('change');
que não estava funcionando para mim..trigger('input');
funciona como mágicaDescobri que, se você não colocar a variável diretamente no escopo, ela será atualizada de forma mais confiável.
Tente usar algum "dateObj.selectedDate" e no controlador adicione a selectedDate a um objeto dateObj da seguinte forma:
Isso funcionou para mim.
fonte
Tente isto
fonte
Basta executar a seguinte linha no final de sua função:
$ scope. $ apply ()
fonte
Aconteça o que acontecer fora do escopo do Angular, o Angular nunca saberá disso.
O ciclo Digest coloca as alterações do modelo -> controlador e, em seguida, do controlador -> modelo.
Se você precisa ver o modelo mais recente, você precisa acionar o ciclo de resumo
Mas existe uma chance de um ciclo de resumo em andamento, então precisamos verificar e inicializar o ciclo.
De preferência, sempre execute uma aplicação segura.
fonte
AngularJS passa string, números e booleanos por valor enquanto passa arrays e objetos por referência. Assim, você pode criar um objeto vazio e tornar sua data uma propriedade desse objeto. Dessa forma, o angular detectará mudanças no modelo.
No controlador
Em html
fonte
Você tem que acionar o evento de mudança do elemento de entrada porque o modelo ng escuta os eventos de entrada e o escopo será atualizado. No entanto, o gatilho jQuery regular não funcionou para mim. Mas aqui está o que funciona como um encanto
Seguir não funcionou
Você pode ler mais sobre como criar e despachar eventos sintéticos .
fonte
Eu escrevi este pequeno plugin para jQuery que fará todas as chamadas para
.val(value)
atualizar o elemento angular, se presente:Basta inserir este script após jQuery e angular.js e as
val(value)
atualizações devem funcionar bem.Versão reduzida:
Exemplo:
Exibir trecho de código
Esta resposta foi copiada literalmente de minha resposta a outra pergunta semelhante .
fonte
Apenas use:
ao invés de:
fonte