angularjs에서 이벤트를 트리거 한 요소에 액세스하는 방법은 무엇입니까?


93

내 웹 앱에서 Bootstrap과 AngularJS를 모두 사용합니다. 두 사람이 함께 일하는 데 어려움이 있습니다.

속성이있는 요소가 있습니다. data-provide="typeahead"

<input id="searchText" ng-model="searchText" type="text"
       class="input-medium search-query" placeholder="title"
       data-provide="typeahead" ng-change="updateTypeahead()" />

그리고 data-source사용자가 필드에 입력 할 때 속성 을 업데이트하고 싶습니다 . 함수 updateTypeahead가 올바르게 트리거되지만 $('#searchText')AngularJS 방식이 아닌 jQuery 방식 인을 사용하지 않는 한 이벤트를 트리거 한 요소에 액세스 할 수 없습니다 .

AngularJS가 이전 스타일의 JS 모듈과 함께 작동하도록하는 가장 좋은 방법은 무엇입니까?

답변:


60
 updateTypeahead(this)

DOM 요소를 함수에 전달하지 않습니다 updateTypeahead(this). 여기 this에서 범위를 참조합니다. DOM 요소에 액세스하려면 updateTypeahead($event). 콜백 함수에서 DOM 요소를 event.target.

참고 : ng-change 함수는 $ event를 변수로 전달할 수 없습니다.


65
ng-change는 매개 변수로 전달되는 이벤트 개체 $ event를 지원하지 않습니다.
Mark Rajcok 2013

1
ng 스타일도 지원하지 않는 것 같습니다.
laggingreflex

4
반대 투표도했습니다. ng-class에서는 작동하지 않습니다. $ event가 정의되지 않았습니다! <li ng-repeat="item in items" role="menuitem" ng-class="{\'selected\' : isSelected($event, item)}">
Saad Benbouzid

4
$ 이벤트가 겨 변화와 함께 일을하지 않는 그래 아니라, 정말 질문에 대답하지 않습니다 /
아드리안 Tombu

1
아마도 SO에서 본 가장 과대 평가 된 답변
MatteoSp

74

이벤트를 트리거 한 요소에 액세스하는 일반적인 Angular 방법은 원하는 이벤트에 지시문과 bind ()를 작성하는 것입니다.

app.directive('myChange', function() {
  return function(scope, element) {
    element.bind('change', function() {
      alert('change on ' + element);
    });
  };
});

또는 DDO (아래 @tpartee의 의견에 따라) :

app.directive('myChange', function() {
  return { 
    link:  function link(scope, element) {
      element.bind('change', function() {
        alert('change on ' + element);
      });
    }
  }
});

위의 지시문은 다음과 같이 사용할 수 있습니다.

<input id="searchText" ng-model="searchText" type="text" my-change>

플 런커 .

텍스트 필드에 입력 한 다음 그대로 두거나 흐리게합니다. 변경 콜백 함수가 실행됩니다. 해당 콜백 함수 내에서 element.

일부 내장 지시문은 $ event 객체 전달을 지원합니다. 예 : ng- * click, ng-Mouse *. ng-change는이 이벤트를 지원하지 않습니다.

$ event 개체를 통해 요소를 가져올 수 있지만 :

<button ng-click="clickit($event)">Hello</button>

$scope.clickit = function(e) {
    var elem = angular.element(e.srcElement);
    ...

이것은 "Angular 방식에 대해 깊은" -Misko .


솔루션이 작동하는 동안 DDO 형식을 사용하지 않기 때문에 바인딩에 범위를 추가 / 전달하는 방법을 알아내는 것이 매우 혼란 스럽습니다. 귀하의 예제에서 범위 지정을 위해 DDO 설탕을 추가하는 간단한 방법은 없으며 ng-click에서 $ event를 전달하는 것만 큼 "Angular 방식에 반대"하는 것처럼 보입니다. 사실 공식 Angular 문서와 코드 예제에서 당신의 것과 구문 적으로 유사한 (즉, DDO없이 익명 함수 만 반환하는 지시문) 하나의 예제를 찾을 수 없었습니다.
tpartee

@tpartee, 좋은 점. 원래이 답변을 작성했을 때 각도 문서에는 익명 함수 (링크 함수)를 반환하는 간단한 지시문의 예가 ​​있습니다. 나는 DDO가 요즘 더 나을 것이라는 데 동의합니다. 답변을 업데이트했습니다.
Mark Rajcok

내가 생각하는 더 나은 것 <버튼 = "clickit ($ event.srcElement를)"버튼을 클릭 겨>
카를로스 ABS

1
시간이 지남에 따라 저는 "
Jacob Stamm

7

요소에 대한 첫 번째 쓰기 이벤트 처럼 쉽게 얻을 수 있습니다.

ng-focus="myfunction(this)"

그리고 아래와 같이 js 파일에서

$scope.myfunction= function (msg, $event) {
    var el = event.target
    console.log(el);
}

나는 그것을 또한 사용했습니다.


8
이것은 범위를 반환하므로 예상대로 작동하지 않습니다.
vdclouis

1
이것은 OP의 문제를 전혀 해결하지 못합니다. 물론 하나의 함수가 호출 된 사람이 누구인지 알 수 있지만 이는 ng-change 호출과 관련이 없으며 둘 사이에 연결이 없습니다. OP에 필요한 것은 함수 호출 내에서 ng-change 이벤트를 트리거 한 요소를 참조 할 수 있어야합니다.
tpartee

이는 속성 (예 : id) : alert (event.target.id)를 추가하여 작동합니다.
Weihui Guo

2

이 문제에 대해 다른 지시문을 생성하지 않으려면 컨트롤러에서 $ element를 사용하는 솔루션이 있습니다.

appControllers.controller('YourCtrl', ['$scope', '$timeout', '$element',
        function($scope, $timeout, $element) {

    $scope.updateTypeahead = function() {
       // ... some logic here
       $timeout(function() {
           $element[0].getElementsByClassName('search-query')[0].focus();
           // if you have unique id you can use $window instead of $element:
           // $window.document.getElementById('searchText').focus();
       });
    }
}]);

그리고 이것은 ng-change 와 함께 작동합니다 .

<input id="searchText" type="text" class="search-query" ng-change="updateTypeahead()" ng-model="searchText" />

0

ng-model 값을 원한다면 트리거 된 이벤트에 다음과 같이 쓸 수 있다면 $ scope.searchText


0

어떤 버전을 가지고 있는지 잘 모르겠지만이 질문은 오래 전에 요청되었습니다. 현재 Angular 1.5에서는 Lodashng-keypress이벤트 및 debounce함수를 사용하여 와 같은 유사한 동작을 에뮬레이션 할 수 있으므로 $ event를 캡처 할 수 있습니다.ng-change

<input type="text" ng-keypress="edit($event)" ng-model="myModel">

$ scope.edit = _.debounce (function ($ event) {console.log ( "$ event", $ event)}, 800)


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