jqLit​​eを使用してクラス名で要素を選択する方法


110

Angular.jsアプリを軽量化するためにjqueryを削除し、代わりにAngularのjqLit​​eを配置しようとしています。しかし、アプリはfind( '#id')とfind( '.classname')を頻繁に使用しますが、これらはjqLit​​eでサポートされていません。

それを変える最善の方法は何だと思いますか。私が考えた1つのアプローチは、カスタム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年

2
@KevinB AngularのjqLit​​eは「タグ名のみ」をサポートすると言われています
Lior

@MarkRajcokディレクティブを定義しませんでした。IEとChromeで動作するようです。しかし、ディレクティブを定義したとしても、なぜそれが役立つのでしょうか?それでもDOM要素を取得する必要があります。
リオール2013年

find( 'span.btn')または類似のものが機能しないのはなぜですか?
Fabi 2013年

回答:


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
Lior

残念ながら、参照されたURLは有効ではなくなり(docs.angularjs.org/guide/dev_guide.mvc.understanding_controller)、そのセクションに代わるものはないようです。
Quested Aronssonによる

いいえ。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);});
ケン

42
elemがjqliteオブジェクトの場合は、次のようになりますangular.element(elem[0].querySelector('.classname'));
cleversprocket

2

angualrは、jqliteと呼ばれるjqueryの軽量バージョンを使用します。つまり、jQueryのすべての機能を備えているわけではありません。これは、jqueryから使用できるものに関するangularjsドキュメントのリファレンスです。 Angular Element docs

あなたのケースでは、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は特にjqLit​​eについて尋ねましたが、jQueryを使用していて、find()がクラスとIDで機能することを期待している人にとっても、この回答は確かに役立つ可能性があります。
Matt B 14

2
明確にするために:「jQueryが利用可能な場合、angular.elementはjQuery関数のエイリアスです。jQueryが利用できない場合、angular.elementはAngularの組み込みjQueryサブセット「jQuery lite」またはjqLit​​eに委任します。引用元:docs.angularjs.org/api/ng/function/angular.element。jqLit​​eにはfind()が含まれています。
Kmaczek 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.