🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

1328閲覧

テーブル上の削除ボタンを押したときにfirestoreのデータも削除したい

teddy1121

総合スコア44

Firebase

Firebaseは、Googleが提供するBasSサービスの一つ。リアルタイム通知可能、並びにアクセス制御ができるオブジェクトデータベース機能を備えます。さらに認証機能、アプリケーションのログ解析機能などの利用も可能です。

Cloud Firestore

Cloud Firestore は、自動スケーリングと高性能を実現し、アプリケーション開発を簡素化するように構築された NoSQLドキュメントデータベースです。

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2021/02/24 03:20

編集2021/02/25 02:22

前提・実現したいこと

firestoreから取得したデータを元にHTMLに日時・出退勤時間をテーブルで表示しています。
先日ここで教えて頂いた方法で、テーブル上での削除はできるようになりました。
今回お助け頂きたいのは、テーブル上で削除したデータ(日付を基準)をfirestore上からも削除する方法です。
collection(userId).doc('2021-02-24')というようにドキュメントを直接指定すれば削除できることはわかっているのですが、jQueryで動的に作成されるテーブルデータの中から特定の行だけ削除したいと思うとさっぱりわからず途方に暮れています。
どなたかお助け頂けたら幸いです。

該当のソースコード

html

1<h1>出退勤リスト</h1> 2 <h2><span id="userNameArea"></span><span>さん</span></h2> 3 4 <div class = "content"> 5 6 <table border="1" id="tableMain"> 7 <thead> 8 <tr> 9 <th>日付</th> 10 <th>出勤</th> 11 <th>退勤</th> 12 <th>削除</th> 13 </tr> 14 </thead> 15 <tbody id="table"></tbody> 16 </table> 17 18 <script type="text/javascript"> 19 20 firebase.auth().onAuthStateChanged((user)=> { 21 userName = user.displayName; 22 23 var src = document.getElementById("userNameArea"); 24 src.innerHTML = userName 25 26 database.collection(userId).get().then((snapshot)=>{ 27 snapshot.forEach((doc)=>{ 28 29 jQuery('#table').append('<tr id=rowId data-rowid="1"><td>'+ doc.data().outTimeValue + '</td><td>'+ doc.data().intime + '</td><td>'+ doc.data().outTime + '</td><td><input type="button" value="削除" class="deleteBtn" id="deleteBtnClick" ></td>') 30 31 table.addEventListener ('click',({target:e})=> e.classList.contains ('deleteBtn') && e.closest ('tr').remove (), false) 32 ↓追記 33 document.getElementById("deleteBtnClick").onclick = function() { 34 database.collection(userId).doc('#(rowId)').delete().then(function(){ 35 console.log("deleted"); 36 }).catch(function(error){ 37 console.error("error"); 38 }); 39 40 }; 41 42 }); 43 }); 44 }); 45 46 </script>

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

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

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

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

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

hoshi-takanori

2021/02/24 04:39

EventListener の中で doc を使って削除すれば良いのでは。 (表示とは別にデータを持つ方が美しいとは思うけど、jQuery だと仕方がないのかなぁ…。)
teddy1121

2021/02/24 05:21

hoshi-takanori様 回答ありがとうございます! EventListenerの中でdocというのは table.addEventListener ('click',({target:e})=> e.classList.contains ('deleteBtn') && e.closest ('tr').remove () && database.collection(userID).doc().delete(), false) このようなものでしょうか? これだとエラーは出ませんが動きませんT_T 見当違いだったらすみません!
hoshi-takanori

2021/02/24 05:32

collection(userId).doc('2021-02-24') というデータ構造であれば、doc.id が '2021-02-24' とかになると思うので、削除はたぶん database.collection(userID).doc(doc.id).delete() かなぁ。(違ったらごめんなさい。)
teddy1121

2021/02/24 06:24

質問を修正しました。 doc.idにしましたが消えませんT_T エラーは出ないです。 HTML上の該当行は消えますがfirestoreは無反応という感じです。 お助けを!
babu_babu_baboo

2021/02/24 15:22 編集

あれほど外に出してって言ったのに… なぜ削除する部分を中に入れた? インデントがずれている th の数と td の数が合ってない。 出社ではなく「出勤」&「退勤」なのでは? userName が表示されていなくて、そもそもの出勤表として成り立つのか? その表には複数の名前とその一覧を表示するのか? また後になって「実は・・・」がありそうなのだが? 受け取ったデータは保持する必要は無い。 テーブルをクリックした行から抜き出せばよい。 なので行またはテーブルに id を書き込んでおけばよい。 毎回 doc.data() を呼び出しているが相当無駄です。
babu_babu_baboo

2021/02/25 02:32

id="deleteBtnClick" これ好きだよね~ id は、そのドキュメントの中で1つだけ使用できます。 提示されたコードだと、出勤レコードの数だけ同じ id が生まれてしまいます。 当然のごとく、削除する関数が同じ数だけ無駄にイベント登録も行われます
teddy1121

2021/02/25 02:35

返信遅くなり申し訳ありません! ご指摘頂いた部分、 ・thの追加 ・出勤・退勤へ変更 ・ユーザー名の表示 ・削除用コードを編集(追記部分)※反応しませんでした… 修正いたしました! このページでは、別ページの出勤・退勤ボタンでfirestoreに日時を記録した上で、その記録の不要な日時を削除したです。 ※理想では「編集」ボタンも付けてポップアップなどで直に修正できる機能もつけられたらいいのですが難しそうで手を出していません。なのでここでは削除だけし、別ページで出勤日時を作成できるようにしようかと思っています。 行にidを振ると教えて頂いたのですが、ここでいう「'<tr id=rowId data-rowid="1">」の部分の「rowId」になるのでしょうか? tableには「tableMain」を振ってあるのですがこれを「doc('#(tableMain)')」としても動きませんでした。 ご教授をお願いします!
babu_babu_baboo

2021/02/25 02:44

1つ訪ねたいのだけれど、 レコードの id って、doc.data().outTimeValue なの? つまり "2012-02-25" みたいな?
teddy1121

2021/02/25 02:53

そうです!日付が入ります! 名前が変ですみません…
guest

回答2

0

ベストアンサー

動くか?

js

1 2<style> 3#tableMain .template { display: none; } 4.userName:after { content: "さん"; } 5 6</style> 7 8<h1>出退勤リスト</h1> 9<h2><output class="userName"></output></h2> 10 11<table border="1" id="tableMain"> 12 <thead> 13 <tr><th>日付 <th>出社 <th>退社 <th>削除 14 15 <tbody> 16 <tr class="template"> 17 <td> 18 <input type="hidden" name="uid"> 19 <output name="outTimeValue" class="id"> 20 <td><input name="inTime"> 21 <td><input name="outTime"> 22 <td><input type="button" value="削除" class="deleteBtn"> 23</table> 24 25 26<script> 27 28const TB = document.getElementById ('tableMain'); 29 30firebase.auth().onAuthStateChanged((user)=> { 31 document.querySelectorAll ('h2 ouput.userName')[0].textContent = user.displayName; 32 33 database.collection(user.uid).get().then((snapshot)=>{ 34 let recs = snapshot.map (doc => Object.assign ({ }, user, doc.data ())); 35 viewRecodes (TB, recs); 36 }); 37}); 38 39 40function viewRecodes (root, recs) { 41 const 42 orign = root.querySelector ('.template'), 43 template = orign.cloneNode (true), 44 parent = orign.parentNode, 45 targets = [...template.querySelectorAll ('*[name]')]; 46 47 template.classList.remove ('template'); 48 template.classList.add ('rec'); 49 50 for (let rec of recs) { 51 for (let e of targets) { 52 if (rec.hasOwnProperty (e.name)) 53 e.value = rec[e.name] || ''; 54 } 55 parent.appendChild (template.cloneNode (true)); 56 } 57} 58 59function getRec (target) { 60 return [...target.querySelectorAll ('*[name]')].reduce ((a, b)=> (a[b.name] = b.value, a), { }); 61} 62 63function deleteRec (rec) { 64 console.log(rec); 65// database.collection (rec.uid).doc (rec.outTimeValue).delete(); 66} 67 68function updateRec (rec) { 69 console.log (rec); 70} 71 72function deleteRow (target) { 73 if (target) { 74 deleteRec (getRec(target)); 75 target.remove (); 76 } 77} 78 79function updateRow (target) { 80 if (target) 81 updateRec (getRec(target)); 82} 83 84 85function handler (event) { 86 let e = event.target; 87 switch (event.type) { 88 case 'click': 89 if (e.classList.contains ('deleteBtn')) 90 deleteRow (e.closest ('.rec')); 91 break; 92 case 'blur': 93 updateRow (e.closest ('.rec')) 94 break; 95 } 96} 97 98 99TB.addEventListener ('click', handler, false); 100TB.addEventListener ('blur', handler, true); 101 102</script> 103

DOM構造を最初から構成するより、テンプレートをコピーして使っています。
編集されたくない場合は readOnly でもつけて切り替えてください
エラーが無いことを祈ります

--
イベントは個別に設定しない
「エリスの胸はパッド入り」のように復唱しましょう!
「イベント監視はお外から」

--
これを試してみる

js

1firebase.auth().onAuthStateChanged((user)=> { 2 document.querySelectorAll ('h2 ouput.userName')[0].textContent = user.displayName; 3 4 database.collection(user.uid).get().then((snapshot)=>{ 5 let recs = [ ]; 6 snapshot.forEach (doc=>recs.push (Object.assign ({ }, user, doc.data ()))); 7 viewRecodes (TB, recs); 8 }); 9});

試してみる2
id, uid を行に記録した。対応したIDを使って削除してみる
update も、もう可能じゃね?

html

1 <td> 2 <input type="hidden" name="uid"> 3 <input type="hidden" name="id">

js

1firebase.auth().onAuthStateChanged((user)=> { 2 document.querySelectorAll ('h2 ouput.userName')[0].textContent = user.displayName; 3 4 database.collection(user.uid).get().then((snapshot)=>{ 5 let recs = [ ], u = { id: user.uid, displayName: user.displayName }; 6 snapshot.forEach (doc=>recs.push (Object.assign ({ }, u, doc.data ()))); 7 viewRecodes (TB, recs); 8 }); 9});

投稿2021/02/25 03:42

編集2021/02/25 11:44
babu_babu_baboo

総合スコア616

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

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

teddy1121

2021/02/25 04:41

回答ありがとうございます! 怖いのでそのまま<body></body>の間に張り付けたのですが、 subscribe.ts:239 TypeError: Cannot set property 'textContent' of undefined at Object.next (timeEdit.html:59) at subscribe.ts:104 at subscribe.ts:233 が出てしまいます。 どこかこちらの環境用に書き換える部分があるのでしょうか? 何度もすみません!
babu_babu_baboo

2021/02/25 04:55

「あぁ~、そこがあれだからあれなんだよ。」 としか言えない。エスパーじゃないし。 だけどこうなるだろうな~とは思ってました。 プログラムを目で追い、解読してみましょう~!
teddy1121

2021/02/25 09:06

アドバイスありがとうございます。 熱暴走しそうな頭で考えました。 先ほどのtextcontentの部分は「h2 ouput.userName」を「.userName」にすることで解決しました。 困ったのはsnapshot.mapです。 ここで「is not function」が発生し、いろいろググりましたがわかりませんでした。 タイプミスもなさそうだし、thenメソッドでsnapshotを呼び出しているから値も取れているのではないかと… 一度頭を冷やしてリトライしてみます!
babu_babu_baboo

2021/02/25 09:26 編集

snapshot は配列じゃないの? console.log(snapshot) した結果が見たいのだけれど フォーカスアウトすると登録変更もできるようにしたんだけどね…
teddy1121

2021/02/25 09:28

og {_: sv, zf: Ov} zf: Ov {_: vy, Id: kv, INTERNAL: {…}, md: K} _: sv {zf: vy, Hf: Dv, ud: Mu, metadata: cv, query: Zp} docs: (...) empty: (...) metadata: (...) query: (...) size: (...) __proto__: Br これで大丈夫ですか?
teddy1121

2021/02/25 09:31

フィールドはこんな感じです。 date:"2021-02-25" intime:"10:00" name:"太郎" outTime:"18:30" outTimeValue:"2021-02-25" uid:"N0hlreOF18QNO6Ah8AxqWyFwt3w2"
teddy1121

2021/02/25 09:32

退勤してしまうので返信遅くなったらごめんなさい>人<
babu_babu_baboo

2021/02/25 10:48

user.uid と フィールドの uid がバッティングしていそう
teddy1121

2021/02/25 11:26

退社・退勤…日本語難しい。。 エラーは出なくなりました!テーブル上では同じく選択したデータが消えています。 ですがfirestore側は反応がありません。 console.logにはちゃんと選択したデータが表示されています。 まだあまり手をつけずにコメントさせていただいていますが取り急ぎ報告させて頂きます。
teddy1121

2021/02/25 12:00

同じくエラーは出ずテーブル上では消えます。logも出ます。 データベース側は消えないですT_T
guest

0

以下の通り変更したら動きました。
$(function(){
$(document).on('click', '.deleteBtn', function() {
$(this).parents('tr').remove();//テーブルの行削除
var deleteDay = $(this).closest('tr').children("td")[0].innerText;//選択行の値を定義

database.collection(userId).doc(deleteDay).delete()//定義された行の削除 }); })

色々教えてくださったbabu_babu_babooさんありがとうございました!

投稿2021/03/01 07:19

teddy1121

総合スコア44

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問