이것은 내 HTML입니다.
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
상자에 입력하면 양방향 바인딩 메커니즘을 통해 모델이 업데이트됩니다. 단.
그러나 JQuery를 통해 이것을 할 때 ...
$('#selectedDueDate').val(dateText);
모델을 업데이트하지 않습니다. 왜?
이것은 내 HTML입니다.
<input id="selectedDueDate" type="text" ng-model="selectedDate" />
상자에 입력하면 양방향 바인딩 메커니즘을 통해 모델이 업데이트됩니다. 단.
그러나 JQuery를 통해 이것을 할 때 ...
$('#selectedDueDate').val(dateText);
모델을 업데이트하지 않습니다. 왜?
답변:
Angular는 그 변화에 대해 알지 못합니다. 이를 위해 다음을 호출 $scope.$digest()
하거나 변경 해야합니다 $scope.$apply()
.
$scope.$apply(function() {
// every changes goes here
$('#selectedDueDate').val(dateText);
});
더티 검사 를 더 잘 이해하려면 이것을 참조하십시오.
업데이트 : 다음 은 예입니다.
function
. $ scope. $ apply를 호출하여 함수를 인수로 전달해야합니다. 그리고 $ scope를 변경할 때 $ apply를 호출해야합니다. 아, 예를 들어 컨트롤러 내부에 DOM 조작을 넣을 것으로 예상합니다. 실제 앱에서는 이것이 잘못되었습니다.)
datepicker="scopeKeyThatYouWant"
입력으로 원하는만큼 여러 번 사용할 수 있습니다
그냥 사용하십시오.
$('#selectedDueDate').val(dateText).trigger('input');
trigger('input')
에서 datepicker와 함께 사용 했습니다 onSelect
. 값을 올바르게 업데이트합니다.
.val('something'
호출을 래핑 $apply
(또는 $digest
나중에 호출 )하지 못했습니다.
$('#selectedDueDate').val(dateText).trigger('change');
나를 위해 일하지 않는 것을 사용하고 있었다. .trigger('input');
마법처럼 작동
변수를 범위에 직접 배치하지 않으면 더 안정적으로 업데이트된다는 것을 발견했습니다.
"dateObj.selectedDate"를 사용해보고 컨트롤러에서 selectedDate를 dateObj 객체에 다음과 같이 추가합니다.
$scope.dateObj = {selectedDate: new Date()}
이것은 나를 위해 일했습니다.
함수 끝에 다음 줄을 실행하십시오.
$ scope. $ apply ()
Angular의 범위 밖에서 일어나는 일이 무엇이든 Angular는 그것을 결코 알 수 없습니다.
다이제스트 사이클은 모델-> 컨트롤러에서 변경 한 다음 컨트롤러-> 모델에서 변경합니다.
최신 모델을 확인해야하는 경우 다이제스트주기를 트리거해야합니다.
그러나 다이제스트주기가 진행 중일 가능성이 있으므로주기를 확인하고 초기화해야합니다.
가급적이면 항상 안전한 적용을 수행하십시오.
$scope.safeApply = function(fn) {
if (this.$root) {
var phase = this.$root.$$phase;
if (phase == '$apply' || phase == '$digest') {
if (fn && (typeof (fn) === 'function')) {
fn();
}
} else {
this.$apply(fn);
}
}
};
$scope.safeApply(function(){
// your function here.
});
AngularJS는 문자열, 숫자 및 부울을 값으로 전달하고 배열과 객체를 참조로 전달합니다. 따라서 빈 개체를 만들고 날짜를 해당 개체의 속성으로 만들 수 있습니다. 그런 식으로 각도는 모델 변경을 감지합니다.
컨트롤러에서
app.module('yourModule').controller('yourController',function($scope){
$scope.vm={selectedDate:''}
});
HTML에서
<div ng-controller="yourController">
<input id="selectedDueDate" type="text" ng-model="vm.selectedDate" />
</div>
ng-model은 입력 이벤트를 수신하고 범위가 업데이트되므로 입력 요소 의 변경 이벤트 를 트리거해야합니다 . 그러나 일반 jQuery 트리거가 작동하지 않았습니다 . 하지만 여기에 매력처럼 작동하는 것이 있습니다.
$("#myInput")[0].dispatchEvent(new Event("input", { bubbles: true })); //Works
팔로 잉이 작동하지 않았습니다.
$("#myInput").trigger("change"); // Did't work for me
합성 이벤트 생성 및 전달 에 대해 자세히 알아볼 수 있습니다 .
나는 jQuery를위한이 작은 플러그인을 작성했다. 이것은 .val(value)
존재한다면 각도 요소 를 업데이트 하기 위해 모든 호출을 할 것이다.
(function($, ng) {
'use strict';
var $val = $.fn.val; // save original jQuery function
// override jQuery function
$.fn.val = function (value) {
// if getter, just return original
if (!arguments.length) {
return $val.call(this);
}
// get result of original function
var result = $val.call(this, value);
// trigger angular input (this[0] is the DOM object)
ng.element(this[0]).triggerHandler('input');
// return the original result
return result;
}
})(window.jQuery, window.angular);
jQuery와 angular.js 다음에이 스크립트를 넣으면 val(value)
업데이트가 잘 작동합니다.
축소 된 버전 :
!function(n,t){"use strict";var r=n.fn.val;n.fn.val=function(n){if(!arguments.length)return r.call(this);var e=r.call(this,n);return t.element(this[0]).triggerHandler("input"),e}}(window.jQuery,window.angular);
예:
이 대답은 다른 유사한 질문에 대한 내 대답 에서 그대로 복사되었습니다 .
다음을 사용하십시오.
$('#selectedDueDate').val(dateText).trigger('input');
대신에:
$('#selectedDueDate').val(dateText);