jqLite를 사용하여 클래스 이름으로 요소를 선택하는 방법은 무엇입니까?


110

더 가볍게 만들기 위해 Angular.js 앱에서 jquery를 제거하고 대신 Angular의 jqLite를 넣으려고합니다. 그러나 앱은 jqLite에서 지원하지 않는 find ( '# id') 및 find ( '. classname')를 많이 사용하고 '태그 이름'(문서에 따라) 만 사용합니다.

그것을 바꾸는 가장 좋은 접근 방식이 무엇이라고 생각하는지 궁금했습니다. 내가 생각한 한 가지 접근 방식은 사용자 정의 HTML 태그를 만드는 것입니다. 예 : 변경
<span class="btn btn-large" id="add-to-bag">Add to bag</span>

<a2b style="display:none;"><span class="btn btn-large" >Add to bag</span></a2b>

$element.find('#add-to-bag') 

$element.find('a2b')

이견있는 사람? 다른 아이디어?

감사

Lior


4
ID는 고유해야하므로 다른 요소의 하위 요소 인 요소를 ID로 찾는 것은 의미가 없습니다. Id로 요소를 선택하기 만하면됩니다. ID가 고유하지 않은 경우 ID를 클래스로 변경하십시오. 또한 DomElement.querySelector(".myclassname")css 선택기를 사용하여 단일 종속 요소를 선택하거나 All을 추가하여 모든 일치 요소를 선택할 수 있습니다 . DomElement.querySelectorAll(".myclassname")물론 IE <9에서는 작동하지 않습니다.
Kevin B

a2b요소 를 정의하는 경우 지시문을 정의해야합니다. 지시어의 링크 함수에서 수행해야하는 작업을 수행 할 수 있으므로 find ()를 완전히 호출 할 필요가 없습니까? 클래스와 마찬가지로-지시문을 정의하고 필요한 기능을 지시문의 링크 (또는 컴파일) 함수에 넣을 수 있습니까?
Mark Rajcok 2013-06-24

2
@KevinB Angular의 jqLite는 '태그 이름 만'지원한다고합니다
Lior

@MarkRajcok 지시문을 정의하지 않았습니다. IE와 크롬에서 작동하는 것 같습니다. 하지만 지시문을 정의한다고해도 왜 도움이 될까요? 여전히 DOM 요소를 가져와야합니다.
Lior

find ( 'span.btn') 또는 이와 유사한 기능이 작동하지 않는 이유는 무엇입니까?
Fabi

답변:


202

본질적으로 @ kevin-b가 언급 한대로 :

// find('#id')
angular.element(document.querySelector('#id'))

//find('.classname'), assumes you already have the starting elem to search from
angular.element(elem.querySelector('.classname'))

참고 : 컨트롤러에서이 작업을 수행하려는 경우 개발자 가이드의 "컨트롤러를 올바르게 사용"섹션을 살펴보고 프레젠테이션 논리를 적절한 지시문 (예 : <a2b ...>)으로 리팩터링 할 수 있습니다. .


3
감사! Ricardo Bin 답변 (angular의 메일 링리스트)에서 추가하려면 $ document injectable도 사용할 수 있습니다. jsfiddle.net/ricardohbin/fTQcs
Lior

불행히도 참조 된 URL은 더 이상 유효하지 않으며 ( docs.angularjs.org/guide/dev_guide.mvc.understanding_controller ) 해당 섹션에 대체 URL이없는 것 같습니다.
Per Quested Aronsson 당 2013

아니요. angular.element (document.querySelector ( '# id'))는 $ ( '# id') 대신 사용할 수 있습니다. elementArray.find ( '# id')
Broda Noel

맞습니다. 그러나 우리가 응용 프로그램의 새로운 부분을 각도로 구축하면서 발견했듯이 우리는 때때로 오래된 부분을 업데이트하거나 리팩토링 할 수있을 때까지 잠시 동안 "덕 테이프"해야합니다. 우리의 경우 기존 혼란을 수정하지 않고 오래된 jquery / ajax 데이터를로드해야했기 때문에 다음을 수행했습니다. $ http.get ( '/ Task / GetTaskStatsByTaskId /'+ taskId) .success (function (data) {angular.element (document.querySelector ( '# userTasksContainer')). html (data);});
Kenn 2015 년

42
elem이 jqlite 객체라면angular.element(elem[0].querySelector('.classname'));
cleversprocket 2015

2

angualr는 jqlite라는 더 가벼운 버전의 jquery를 사용하므로 jQuery의 모든 기능이 포함되어 있지 않습니다. 다음은 jquery에서 사용할 수있는 것에 대한 angularjs 문서의 참조입니다. 각도 요소 문서

귀하의 경우에는 ID 또는 클래스 이름이있는 div를 찾아야합니다. 사용할 수있는 클래스 이름

var elems =$element.find('div') //returns all the div's in the $elements
    angular.forEach(elems,function(v,k)){
    if(angular.element(v).hasClass('class-name')){
     console.log(angular.element(v));
}}

또는 쿼리 선택기로 훨씬 더 간단한 방법을 사용할 수 있습니다.

angular.element(document.querySelector('#id'))

angular.element(elem.querySelector('.classname'))

jQuery만큼 유연하지는 않지만


1

elem.find()이 작동하지 않는 경우 각도 스크립트 전에 JQuery 스크립트 포함하고 있는지 확인하십시오 ....


3
OP가 jqLite에 대해 구체적으로 물었지만 jQuery를 사용하고 find ()가 클래스 및 ID와 함께 작동하기를 기대하는 사람들에게는이 답변이 확실히 도움이 될 수 있습니다.
Matt B

2
"jQuery를 사용할 수있는 경우 angular.element는 jQuery 함수의 별칭입니다. jQuery를 사용할 수없는 경우 angular.element는"jQuery lite "또는 jqLite라고하는 Angular의 기본 제공 jQuery 하위 집합에 위임합니다.") 인용 출처 : docs.angularjs.org/api/ng/function/angular.element . jqLite에는 find ()가 포함되어 있습니다.
Kmaczek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.