angularjs에서 클릭 된 요소에 액세스


173

나는 AngularJS를 처음 접했고 개념을 이해하지 못하는 것 같습니다. Twitter Bootstrap도 사용하고 있으며 jQuery가로드되어 있습니다.

워크 플로우 : 사용자가 목록에서 링크를 클릭하면 "마스터"섹션이 업데이트되고 클릭 한 링크 사용자가 활성 클래스를 얻습니다.

기본 HTML 마크 업 :

<ul class="list-holder" ng-controller="adminController">
   <li><a ng-click="setMaster('client')">Clients</li>
   <li><a ng-click="setMaster('employees')">Employees</li>
   <li><a ng-click="setMaster('etc')>Etc...</li>
</ul>

jQuery에서 이것을하기 :

jQuery(".list-holder").on('click', 'a', function(event){
    event.preventDefault();
jQuery(".list-holder li").removeClass('active');
jQuery(this).parent('li').addClass('active');
});

그러나 Angular를 사용하여 서버에서 마스터 목록 (JSON 형식)을 가져 와서 페이지의 목록을 업데이트하기 때문에 Angular와 jQuery를 통합하는 방법을 알 수 없습니다.

이것을 어떻게 통합합니까? 각도 컨트롤러 기능에 들어가면 클릭 한 요소를 찾을 수없는 것 같습니다.

제어 장치:

function adminController($scope)
    {    
        $scope.setMaster = function(obj)
        {
            // How do I get clicked element's parent li?
            console.log(obj);
        }
    }

답변:


283

AngularJS와가 수 있지만 당신은 클릭 이벤트에 손을 얻기 위해 (그리고 그것의 대상) 다음 구문은 (메모 $event받는 인수 setMaster기능 여기에 문서를 : http://docs.angularjs.org/api/ng.directive : ng 클릭 ) :

function AdminController($scope) {    
  $scope.setMaster = function(obj, $event){
    console.log($event.target);
  }
}

이것은이 문제를 해결하는 각도가 아닙니다. AngularJS에서는 모델 조작에 중점을 둡니다. 하나는 모델을 변경하고 AngularJS가 렌더링을 알아낼 수있게합니다.

이 문제를 해결하는 AngularJS 방식은 (jQuery를 사용 하지 않고 $event인수 를 전달하지 않아도 됨 ) 다음과 같습니다.

<div ng-controller="AdminController">
    <ul class="list-holder">
        <li ng-repeat="section in sections" ng-class="{active : isSelected(section)}">
            <a ng-click="setMaster(section)">{{section.name}}</a>
        </li>
    </ul>
    <hr>
    {{selected | json}}
</div>

컨트롤러의 메소드는 다음과 같습니다.

$scope.setMaster = function(section) {
    $scope.selected = section;
}

$scope.isSelected = function(section) {
    return $scope.selected === section;
}

완전한 jsFiddle은 다음과 같습니다. http://jsfiddle.net/pkozlowski_opensource/WXJ3p/15/


198
참고 : $ event는 마크 업을 통과하지 않으면 작동하지 않습니다 ng-click="setMaster(section, $event)".
Ben Lesh

4
실제로는 함수에 전달되어야합니다. 그러나 실제로 컨트롤러에서 이와 같은 돔 관련 항목을 참조하는 것이 가장 좋은 아이디어는 아닙니다. 일반적으로 $ event가 사용될 때, 이는 전파 중지 등의 맥락에서 이루어집니다. <a ng-click="doSomething(); $event.stopPropagation()">Click Just Me</a>
Ben Lesh

9
버튼 안에 아이콘이있어서 $ event.target을 사용하는 데 문제가있었습니다. 따라서 때로는 대상 결과가 버튼이고 때로는 클릭 한 위치에 따라 아이콘이기도합니다. 대상 대신 $ event.currentTarget을 사용했으며 매력처럼 작동했습니다.
lao

4
$event.target이와 같이 사용 하는 것이 "각도"가 아닐 수도 있지만 ng-repeat변경 사항을 평가하기 위해 청취자가 필요한 모든 항목에 대해 큰 목록을 갖는 것 같지 않습니까? 하나의 요소를 클릭하면 전체 목록의 모든 항목을 다시 평가해야합니까? $event.target예를 들어 CSS 클래스를 토글하기 위해 하나의 항목을 대상으로 지정하는 것이 어떻습니까? 어떻게 생각해? Phonegap 앱을 만들고 있는데 가능한 모든 성능 조정을해야합니다.
Bradley Flood

13
또한 $event.currentTarget대신 사용 하는 것이 좋습니다 $event.target. ng-click이있는 요소에 자식 요소가 있으면 자식 요소를 클릭하면 자식 요소가 $event.target됩니다. $event.currentTarget지정된 ng-click으로 항상 요소를 타겟팅합니다.
유전자 Parcellano
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.