jQuery로 입력 값을 설정 한 후 각도 모델 업데이트


160

이 간단한 시나리오가 있습니다.

jQuery의 val () 메소드에 의해 값이 변경되는 입력 요소.

jQuery가 설정 한 값으로 각도 모델을 업데이트하려고합니다. 간단한 지시문을 작성하려고했지만 원하는 것을하지 않습니다.

지시어는 다음과 같습니다.

var myApp = angular.module('myApp', []);
myApp.directive('testChange', function() {
    return function(scope, element, attrs) {        
        element.bind('change', function() {
            console.log('value changed');
        })
    }
})

이것은 jQuery 부분입니다.

$(function(){
    $('button').click(function(){
        $('input').val('xxx');
    })
})

그리고 html :

<div ng-app="myApp">
    <div ng-controller="MyCtrl">
        <input test-change ng-model="foo" />
        <span>{{foo}}</span>
    </div>
</div>

<button>clickme</button>

내 시도와 바이올린은 다음과 같습니다.
//jsfiddle.net/U3pVM/743/

누군가 올바른 방향으로 나를 가리킬 수 있습니까?


2
지시문 외부의 Mix AngularJS와 jQuery는 종종 나쁜 생각입니다. jQuery는 당신이하고 싶은 일에 필수적입니까?
Blackhole

모델의 값을 변경하기 위해 컨트롤러의 함수에 각도가있는 클릭 이벤트를 설정하지 않는 이유는 무엇입니까?
지미 케인

@ Blackhole, 나는 jquery 업로드 플러그인을 사용하고 있으며 작업을 수행하고 업로드 된 파일의 경로를 숨겨진 입력에 넣습니다. 필요한 것은 각도 모델에서 해당 경로에 액세스하는 것입니다. 그래서 숨겨진 입력 값으로 설정하고 변경 한 후에 각도 모델을 업데이트 할 것이라고 생각했습니다.
Michal J.

바이올린에 Jquery 호출이 표시되지 않습니다 ... JQ로 값을 변경하는 위치를 확인하고 가리킬 수 있습니까?
Valentyn Shybanov 2016 년

바이올린은이 질문과 관련이없는 Todo 샘플 앱에 연결됩니다.
Stewie

답변:


322

ngModel은 "입력"이벤트를 수신하므로 코드를 "수정"하려면 값을 설정 한 후 해당 이벤트를 트리거해야합니다.

$('button').click(function(){
    var input = $('input');
    input.val('xxx');
    input.trigger('input'); // Use for Chrome/Firefox/Edge
    input.trigger('change'); // Use for Chrome/Firefox/Edge + IE11
});

이 특정 동작에 대한 설명은 " AnularJS가 내부적으로 'onclick', 'onchange'와 같은 이벤트를 어떻게 포착합니까? "라는 답변을 확인하십시오.


그러나 불행히도 이것이 당신이 가진 유일한 문제는 아닙니다. 다른 게시물 주석에서 지적했듯이 jQuery 중심 접근 방식은 명백히 잘못되었습니다. 자세한 내용은이 게시물을 살펴보십시오 . jQuery 배경이있는 경우 어떻게“AngularJS를 생각합니까?” ).


5
멋있는! 한 가지 예외가 있는데 왜 숨겨진 입력에서 작동하지 않습니까? 입력 유형을 텍스트로 전환하면 예상대로 작동합니다.
Karol

8
이것은 jquery 일정 플러그인을 사용할 때 주요 문제를 해결했습니다. input.val () 다음에 플러그인을 트리거 ( 'input')하도록 해킹하면 사용자가 달력 날짜를 선택한 후 ng-change 이벤트가 시작됩니다. 감사!
드론 브레인

3
숨겨진 입력에서 완벽하게 작동합니다. element.triggerHandler ( "change");
falko

2
이것은 나를 위해 작동하지 않습니다. $ ( "# Distance"). val (data); $ ( "# Distance"). trigger ( 'input');
Stas Svishov

10
Angular 1.4.3에서는 inputIE11을 포함한 IE 에서 이벤트가 작동하지 않습니다. input이벤트 $sniff.hasEvent('input')는 true 일 때만 작동 하지만 $sniff.hasEvent('input')IE11에서도 false입니다! 대신 change이벤트 를 사용할 수 있습니다 .
Shuhei Kagawa

61

이것이 누군가에게 유용하기를 바랍니다.

나는 얻을 수 없었다 jQuery('#myInputElement').trigger('input')각도 앱 이벤트 습니다.

그러나 나는 angular.element(jQuery('#myInputElement')).triggerHandler('input')데리러 올 수 있었다 .


2
코드를 작성하지 말고 솔루션을 설명하십시오. 나는 $가 아닌 함수되지 않은 각도 얻을
Thakhani Tharage

1
$는 여기서 jQuery를 나타냅니다. 질문에 태그되어 있습니다.
ginman

$ ( 'myInputElement'). trigger ( 'input')이 비정상적 인 동안 이것은 나를 위해 일했습니다. 때로는 무작위로 작동하지만 다른 사람들에게는 효과가없는 것처럼 보였으며 결코 패턴을 설정할 수 없었습니다. 이 솔루션은 항상 작동합니다.
BryanP

2
광산은 # 접두사와 함께 일한다 :angular.element($('#myInputElement')).triggerHandler('input')
일러스트 Ebru Yener을

이 triggerHandler도 나를 위해 일했습니다. 텍스트 영역이 아닌 입력을 처리하고있었습니다. 감사합니다
Mounir

25

inputjQuery로 이벤트를 트리거 한 수락 된 답변이 효과가 없었습니다. 이벤트를 작성하고 기본 JavaScript로 디스패치하는 것이 트릭입니다.

$("input")[0].dispatchEvent(new Event("input", { bubbles: true }));

이것은 나에게도 해결책이었습니다. Angular 1.1.5, jQuery 2.2.4 및 Jasmine 2.5.3 사용 다른 트리거 메커니즘이 작동하지 않는 것이 매우 이상합니다.
Lars-Erik

스크립트에서 입력을 설정할 때 양식 유효성 검사를 트리거하기위한 기본 JS 방법을 찾고 있었는데 이것이 도움이되었습니다.
분산

Angular 5에서도 작동합니다.
Igor

감사합니다. webview.evaluate에서 특히 도움이 됨 javascript
Berry Wing

22

jQuery가 필요하다고 생각하지 않습니다.

대신 $ watchng-click을 사용할 수 있습니다

<div ng-app="myApp">
  <div ng-controller="MyCtrl">
    <input test-change ng-model="foo" />
    <span>{{foo}}</span>

    <button ng-click=" foo= 'xxx' ">click me</button>
    <!-- this changes foo value, you can also call a function from your controller -->
  </div>
</div>

컨트롤러에서 :

$scope.$watch('foo', function(newValue, oldValue) {
  console.log(newValue);
  console.log(oldValue);
});

1
Utopik에게 감사합니다. 맞습니다. 앵글을 사용하여 작업을 수행하는 방법이있을 때 jquery를 앵귤러와 혼합해서는 안됩니다.
Michal J.

17

다음과 같이 특정 입력 모델의 범위를 업데이트하려면 다음 코드를 사용해야합니다

$('button').on('click', function(){
    var newVal = $(this).data('val');
    $('select').val(newVal).change();

    var scope = angular.element($("select")).scope();
    scope.$apply(function(){
        scope.selectValue = newVal;
    });
});

1
var scope = angular.element($("select")).scope(); scope.$apply(function(){ scope.selectValue = newVal; }); 그 부분은 저에게 많은 도움이되었습니다. 내 문제는 성공 함수에서 jquery ajax 호출 후 각도 모델을 업데이트하는 것이 었습니다. 다른 것을하고있는 요소에 대한 중복 변경 이벤트 리스너가 있었기 때문에 $ http로 느려서 jQuery에 병합했습니다.
Emmanuel Mahuni

1
element.scope ()는 로깅이 활성화 된 상태에서만 작동하기 때문에 좋지 않습니다. 프로덕션 사이트에서는 구성에 대한 로깅을 비활성화 $compileProvider.debugInfoEnabled(false);하거나 $logProvider.debugEnabled(false);자세한 내용은 code.angularjs.org/1.4.0/docs/guide/production 을 참조하십시오.
RWAM

숨겨진 변수 에이 방법을 시도해 보았습니다. var li_cuboid_id = $ ( '# li_cuboid_id'); li_cuboid_id.val (json.cuboidId) .change (); var scope = angular.element ($ ( "# li_cuboid_id")). scope (); scope. $ apply (function () {scope.cuboidId = json.cuboidId;}); 숨겨진 변수는 다음과 같이 정의됩니다 : <input id = "li_cuboid_id"type = hidden ng-model = "cuboidId">
Rahul Varadkar

7

액션 버튼에 리스너를 추가하여 컨트롤러 초기화 만 수정했습니다.

$(document).on('click', '#action-button', function () {
        $timeout(function () {
             angular.element($('#input')).triggerHandler('input');
        });
});

내 경우에는 다른 솔루션이 작동하지 않았습니다.


4

나는 여기에 대답하는 것이 약간 늦다는 것을 알고 있지만 어쩌면 나는 하루를 한 번 구할 수도 있습니다.

나는 같은 문제를 다루고있다. jQuery에서 입력 값을 업데이트하면 모델이 채워지지 않습니다. 트리거 이벤트를 사용해 보았지만 결과가 없습니다.

내가 한 일이 당신의 하루를 구할 수 있습니다.

HTML에서 스크립트 태그 내에 변수를 선언하십시오.

처럼:

<script>
 var inputValue="";

// update that variable using your jQuery function with appropriate value, you want...

</script>

일단 아래의 각도 서비스를 사용하여 그렇게했습니다.

이제 동일한 컨트롤러 범위에서 호출 된 getData 함수 아래에 원하는 값이 제공됩니다.

var myApp = angular.module('myApp', []);

app.controller('imageManagerCtrl',['$scope','$window',function($scope,$window) {

$scope.getData = function () {
    console.log("Window value " + $window.inputValue);
}}]);

3

나는 .val(value)각도 요소 를 업데이트 하기 위해 모든 호출을 할 jQuery 용이 작은 플러그인을 작성했다 .

(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);

예:


이것을 파헤쳐 서 유감스럽게 생각하지만, .val 대신 .prop를 사용하기 때문에 이것이 확인란이나 선택에서 어떻게 작동 할 수 있습니까? 이것은 최소한 입력 .val 변경에 완벽하게 작동하므로 감사합니다!
오스틴

@Austin 잘 모르겠습니다. 이것은 구식으로 널리 알려진 두 가지 기술에 대한 5 살짜리 질문입니다. 그래도 필요한 솔루션을 얻는 것이 가장 좋습니다.
dav_i

2

IE를 사용하는 경우 다음을 사용해야합니다. input.trigger ( "change");


2

.change()값을 설정 한 후 추가하십시오 .

예:('id').val.('value').change();

또한 HTML에 태그 를 추가 onchange하거나 추가하는 것을 잊지 마십시오ng-change


0

Vanilla / jQuery를 사용하여 외부에서 ngModel의 값을 업데이트 할 수 있도록이 작업을 수행했습니다.

function getScope(fieldElement) {
    var $scope = angular.element(fieldElement).scope();
    var nameScope;
    var name = fieldElement.getAttribute('name');
    if($scope) {
        if($scope.form) {
            nameScope = $scope.form[name];
        } else if($scope[name]) {
            nameScope = $scope[name];
        }
    }
    return nameScope;
}

function setScopeValue(fieldElement, newValue) {
    var $scope = getScope(fieldElement);
    if($scope) {
        $scope.$setViewValue(newValue);
        $scope.$validate();
        $scope.$render();
    }
}

setScopeValue(document.getElementById("fieldId"), "new value");
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.