Mam taki prosty scenariusz:
Element wejściowy, którego wartość jest zmieniana przez metodę val () jQuery.
Próbuję zaktualizować model kątowy o wartość ustawioną przez jQuery. Próbowałem napisać prostą dyrektywę, ale nie robi ona tego, co chcę.
Oto dyrektywa:
var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
return function(scope, element, attrs) {
element.bind('change', function() {
console.log('value changed');
})
}
})
to jest część jQuery:
$(function(){
$('button').click(function(){
$('input').val('xxx');
})
})
i html:
<div ng-app="myApp">
<div ng-controller="MyCtrl">
<input test-change ng-model="foo" />
<span>{{foo}}</span>
</div>
</div>
<button>clickme</button>
Oto skrzypce z moją próbą:
http://jsfiddle.net/U3pVM/743/
Czy ktoś może wskazać mi właściwy kierunek?
Odpowiedzi:
ngModel nasłuchuje zdarzenia „input”, więc aby „naprawić” kod, musiałbyś wyzwolić to zdarzenie po ustawieniu wartości:
Aby wyjaśnić to konkretne zachowanie, zapoznaj się z odpowiedzią, której udzieliłem jakiś czas temu: „W jaki sposób AngularJS wewnętrznie przechwytuje zdarzenia takie jak 'onclick', 'onchange'? ”
Ale niestety nie jest to jedyny problem, jaki masz. Jak wskazano w innych komentarzach do postów, podejście skoncentrowane na jQuery jest po prostu błędne. Aby uzyskać więcej informacji, spójrz na ten post: Jak „myśleć w AngularJS”, jeśli mam tło w jQuery? ).
źródło
input
zdarzenie nie działa w IE, w tym IE11.input
zdarzenie działa tylko wtedy, gdy$sniff.hasEvent('input')
jest prawdziwe, ale$sniff.hasEvent('input')
jest fałszywe nawet w IE11! Zamiast tego możemy użyćchange
zdarzenia .Mam nadzieję, że to komuś się przyda.
Nie udało mi się odebrać
jQuery('#myInputElement').trigger('input')
wydarzenia w mojej aplikacji kątowej.Udało mi się jednak mnie
angular.element(jQuery('#myInputElement')).triggerHandler('input')
zabrać.źródło
angular.element($('#myInputElement')).triggerHandler('input')
Zaakceptowana odpowiedź, która wyzwalała
input
zdarzenie w jQuery, nie działała dla mnie. Utworzenie zdarzenia i wysłanie go za pomocą natywnego JavaScript załatwiło sprawę.źródło
Nie sądzę, aby jQuery było tutaj wymagane.
Można użyć $ zegarek i ng kliknięcie zamiast
W kontrolerze:
źródło
Aby zaktualizować zakres określonego modelu wejściowego, należy użyć następującego kodu w następujący sposób
źródło
var scope = angular.element($("select")).scope(); scope.$apply(function(){ scope.selectValue = newVal; });
ta porcja bardzo mi pomogła. Moim problemem była aktualizacja modelu kątowego po wywołaniu jquery ajax w funkcji sukcesu. To było powolne z $ http, ponieważ istniał zduplikowany detektor zdarzeń zmian dla elementu, który robił coś innego, więc połączyłem go z jQuery.$compileProvider.debugInfoEnabled(false);
lub$logProvider.debugEnabled(false);
Zobacz code.angularjs.org/1.4.0/docs/guide/production, aby uzyskać więcej informacji.Modyfikacje dokonałem tylko na inicjalizacji kontrolera, dodając odbiornik na przycisku akcji:
Inne rozwiązania nie działały w moim przypadku.
źródło
Wiem, że jest trochę za późno na odpowiedź, ale może uda mi się zaoszczędzić jeden raz dziennie.
Miałem do czynienia z tym samym problemem. Model nie zostanie wypełniony po zaktualizowaniu wartości danych wejściowych z jQuery. Próbowałem użyć zdarzeń wyzwalających, ale bez rezultatu.
Oto, co zrobiłem, co może uratować twój dzień.
Zadeklaruj zmienną w tagu skryptu w formacie HTML.
Lubić:
Kiedyś to zrobiłeś, korzystając z poniższej usługi angular.
Teraz poniżej funkcja getData wywołana z tego samego zakresu kontrolera poda żądaną wartość.
źródło
Napisałem tę małą wtyczkę do jQuery, która będzie wykonywać wszystkie wywołania
.val(value)
aktualizacji elementu kątowego, jeśli jest obecny:Po prostu włóż ten skrypt po tym, jak jQuery i angular.js, a
val(value)
aktualizacje powinny teraz działać dobrze.Wersja zminimalizowana:
Przykład:
Pokaż fragment kodu
źródło
Jeśli używasz IE, musisz użyć: input.trigger ("change");
źródło
dodać
.change()
po ustawieniu wartości.przykład:
('id').val.('value').change();
nie zapomnij również dodać
onchange
lubng-change
oznaczyć w htmlźródło
Zrobiłem to, aby móc zaktualizować wartość ngModel z zewnątrz za pomocą Vanilla / jQuery:
źródło