質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

Q&A

解決済

1回答

3565閲覧

AngularJSでng-repeatしている要素のDOMプロパティにアクセスしたい

MasakazuFukami

総合スコア1869

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

AngularJS

AngularJSはオープンソースのJavaScriptフレームワークです。ブラウザ上で動作するウェブアプリケーションの開発にMVCアーキテクチャを取り入れることを目的としています。

0グッド

0クリップ

投稿2017/04/26 10:34

編集2017/04/26 10:37

いつもお世話になっております。

AngularJS ver1.6.2を使用してアプリケーションを開発しています。

今、ng-repeatを使用してカレンダー表示を作っています。
また、カレンダーの日付を押すと画面上のその日付の場所に応じてポップアップの位置を調整しようと思っています。

今回は、ng-repeatで生成された要素ごとにポップアップの表示位置を変更するため、ng-styleを使用してcontroller側で計算した値を返そうと思っています。
以下のようなイメージです。

html

1<td ng-repeat="d in days"> 2 <span>{{d}}</span> 3 <div class="popup" ng-style="setStyle()">ポップアップ</div> 4</td>

js

1// controller内 2$scope.setStyle(function(){ 3 // 引数にdomにアクセエス出来るデータを取得 4 //ここでdomのプロパティからポップアップの場所を計算 5 const t = 999; // 計算したtopからの座標 6 const l = 999; // 計算したleftからの座標 7 return { 8 top: t, 9 left: l 10 } 11}) 12

このようにcontrollerで定義した関数からng-styleにhashを返して動的にstyleを変えたいと思っています。

この場合、setStyleの引数にどうにかしてdomの情報にアクセスできるものを渡さないといけないのではと思っています。

この場合どのようにしてsetStyleにdomの情報を渡すことが出来るのでしょうか。

ご教授よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

色々とやり方はあるとは思うのですが、例えば「d」オブジェクトのプロパティをdiv要素のidにして、それをsetStyleに渡し、そのidからDOMを取得してはいかがでしょう?
idでなくても、daysは日付でしょうから1~31ぐらいの日付を識別するための何かを保持しているでしょうし、それをidにするなど。$indexも上手く使えるかもしれません。

HTML

1<td ng-repeat="d in days"> 2 <span>{{d}}</span> 3 <div id={{d.id}} class="popup" ng-style="setStyle(d.id)">ポップアップ</div> 4</td>

JavaScript

1// controller内 2$scope.setStyle(function(id){ 3 4 5 document.getElementById(id);// 引数にdomにアクセエス出来るデータを取得 6 return { 7 //頑張って計算した結果を返却 8 } 9})

投稿2017/04/26 11:21

編集2017/04/26 11:22
akabee

総合スコア1947

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakazuFukami

2017/04/26 11:27

ご回答ありがとうございます!!!! なるほど! 完全にこの方法でいけますね!!! 非常に参考になりました!
akabee

2017/04/26 11:45 編集

すみません、書き込んでから気付いて修正しようとしていたのですが、このコードだとgetElementById(id)が行われたタイミングでまだDOMがなく、エラーになる可能性があります。安易に回答してしまい、すみません。 ただng-repeatの要素のDOM取得自体はこんな感じでいけると思います。 個人的に、表示位置関連で同様のことをしたときはクリックされたタイミングでクリックされたDOMのidを取得しグローバル変数に格納するようなDirectiiveを作成し、スクロールが発生する直前のイベント処理でそのidを受け取って、そのidから表示すべき位置を計算してしかるべき表示を行うというようなことをしました。 なぜそんな面倒なことをするかというと、画面がスクロールするため表示位置を絶対位置で求めることができず、常にクリックされたタイミングでのDOMの現在位置を把握したうえで位置の計算を行う必要があったからです。 画面が固定表示されているのであれば、そこまで面倒ではないかもしれません。 参考になれば・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問