天道酬勤,学无止境

使用 JavaScript 从 firebase 中删除对象(Remove object from firebase using JavaScript)

问题

我在 firebase-database 上设置了一些对象,并在带有“child_added”和 append() 的 HTML 表上显示它们,以便在将它们添加到数据库后立即动态添加它们,并且每行必须有一个删除按钮的表,但问题是,我无法让这个删除按钮工作......

这是数据库结构的样子:

Assets: {
    -KkBgUmX6BEeVyrudlfK: {
        id: '-KkBgUmX6BEeVyrudlfK',
        name: 'John',
        brand: 'HP'
    }
    -KkDYxfwka8YM6uFOWpH: {
        id: '-KkDYxfwka8YM6uFOWpH',
        name: 'Jack',
        brand: 'Dell'
    }
}

这是我的index.js

var rootRef = firebase.database().ref().child("Assets");
$("#table_body").on('click','.delete-btn', function(e){
    var $row = $(this).closest('tr'),
       rowId = $row.data('id');
    var assetKey = rootRef.child("id");
    //it should remove the firebase object in here
    rootRef.child(assetKey).remove()
    //after firebase confirmation, remove table row
    .then(function() {
      $row.remove();
    })
    //Catch errors
    .catch(function(error) {
      console.log('ERROR');
    });  
});

rootRef.on("child_changed", snap => {

  var assetKey = snap.child("id").val();
  var name = snap.child("name").val();
  var brand = snap.child("brand").val();

$("#table_body").append("<tr data-id='"+assetKey+"'>"+
                          "<td>" + name + "</td>" +
                          "<td>" + brand + "</td>" +

                          "<td><div buttons>"+
                                  "<button class='delete-btn>delete</button>"+
                                  "</div></td></tr>");
});

assetKey rootRef.on("child_changed", snap => { if 显示在 console.log 中的assetKey 返回对象键的正确值,但$("#table_body").on('click','.delete-btn', function(e){无法正常工作...

回答1

这条线在我看来是错误的(试图获取顶级Assets节点的不存在的id属性):

var assetKey = rootRef.child("id");

试试这个:

var rowId = $row.data('id');
rootRef.child(rowId).remove()
...

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Firebase 删除后返回带有未定义对象的数组(Firebase returns array with undefined object after remove)
    问题 从 Firebase 数据库中删除元素时遇到问题。 结构如下(只是一个例子): { "users": [ { "id": 0, "name": "Toma Broome" }, { "id": 1, "name": "Boyd Bolens" } ] } 我正在获取用户列表连接是这样的: firebase.database().ref("/users/").on("value", snap => { users = snap.val(); console.log( users ); // pay attention to this line usersLoop(); }); 然后我在屏幕上渲染元素并尝试删除一个: firebase.database().ref(`/users/${targetEl}`).remove(); 如果我检查 Firebase 控制台,该元素实际上已从数据库中删除,但用户数组包含undefined值,并且在删除某些元素后它返回一个对象而不是数组。 这是删除数据库第一个位置的三个元素后的控制台。 我的意思是我获得了完整的用户列表(我使用 JSON 文件上传),我删除了第一个元素,然后在 DOM 中重新呈现所有其他元素。 然后我再次删除第一个元素,最后当我第三次删除第一个元素时,我从 firebase 获取一个对象,显然没有渲染任何内容
  • Firebase 函数(用 NodeJS 编写)用于在从实时数据库中删除对象时从 Cloud Storage 中删除文件(Firebase function (written in NodeJS) to delete file from Cloud Storage when an object is removed from Realtime Database)
    问题 我是 NodeJS 的新手,我正在尝试为 Firebase 的 Cloud Functions 编写下一个方法。 我想要达到的目标: 当用户从 Firebase DB 中删除 Photo 对象时,应触发该函数; 该代码应从与 Photo obj 对应的 Storage 中删除文件对象。 这是我的 Firebase 数据库结构: 照片/{userUID}/{photoUID} { "dateCreated": "2017-07-27T16:40:31.000000Z", "isProfilePhoto": true, "isSafe": true, "uid": "{photoUID}", "userUID": "{userUID}" } 和 Firebase 存储格式: 照片/{userUID}/{photoUID}.png 我正在使用的 NodeJS 代码: const functions = require('firebase-functions') const googleCloudStorage = require('@google-cloud/storage')({keyFilename: 'firebase_admin_sdk.json' }) const admin = require('firebase-admin') const vision =
  • Firebase 函数(用 NodeJS 编写)用于在从实时数据库中删除对象时从 Cloud Storage 中删除文件(Firebase function (written in NodeJS) to delete file from Cloud Storage when an object is removed from Realtime Database)
    问题 我是 NodeJS 的新手,我正在尝试为 Firebase 的 Cloud Functions 编写下一个方法。 我想要达到的目标: 当用户从 Firebase DB 中删除 Photo 对象时,应触发该函数; 该代码应从与 Photo obj 对应的 Storage 中删除文件对象。 这是我的 Firebase 数据库结构: 照片/{userUID}/{photoUID} { "dateCreated": "2017-07-27T16:40:31.000000Z", "isProfilePhoto": true, "isSafe": true, "uid": "{photoUID}", "userUID": "{userUID}" } 和 Firebase 存储格式: 照片/{userUID}/{photoUID}.png 我正在使用的 NodeJS 代码: const functions = require('firebase-functions') const googleCloudStorage = require('@google-cloud/storage')({keyFilename: 'firebase_admin_sdk.json' }) const admin = require('firebase-admin') const vision =
  • 通过 angularfire 仅删除一个项目(remove just a item by angularfire)
    问题 我只想删除一个项目,但我的代码删除了所有项目。 我不明白,也找不到其他解决方案, 请帮忙 <div ng-repeat="(id, data) in datas"> <input type="text" ng-model="data.name" ng-change="datas.$save(data)" /> <input type="text" ng-model="data.age" ng-change="datas.$save(data)" /> <a ng-click="removeItem(id)">delete</a> </div> ref = new Firebase(FIREBASE_URL); authData = ref.getAuth(); obj = $firebaseObject(ref); obj.$remove(id); 回答1 如果FIREBASE_URL指向您的列表(甚至整个数据库),那么您的代码确实会删除该列表。 这是预期的行为。 由于您使用的是$firebaseObject ,因此调用$remove()将删除该对象; 在这种情况下,整个项目列表。 要仅删除具有id的项目: var ref = new Firebase(FIREBASE_URL); var items = $firebaseArray(ref); items.$remove
  • 使用 Javascript 删除 Firebase(Firebase Remove with Javascript)
    问题 所以我有这个代码: firebase.database().ref('putninalog/'+ NadiiIndeksNaloga()).remove(); 这将删除 etc. [0] 以及连接到数据库中该索引的所有数据(确切地说是哪个数字并不重要)。 当我删除该索引时,如何更新所有其他索引以从 0 开始。 例子: [0] [1] [2] [3] 我删除: [0] 这保持: [1] [2] [3] 我要这个: [0] [1] [2] 回答1 没有办法在一个索引处删除一个项目,然后在一个操作中更新所有后续索引。 你不得不: 将整个父节点读入您的应用程序代码。 从应用程序代码中的数组中删除该项目。 将整个数组写回数据库。 如果其他用户可能同时操作数组,则必须使用事务来执行此操作以防止更新相互冲突。 要了解有关在 Firebase 中处理数据列表的更好方法的更多信息,我建议阅读有关将项目附加到数据列表的文档和博客文章最佳实践:Firebase 中的数组。 回答2 我做了一些挖掘,我不能按照我想要的方式进行。 感谢弗兰克的回答,我意识到了这一点。 我这样做是为了找到每个项目的索引: ref.on('value',function(snap) { snap.forEach(function(child) { console.log(child.ref_.path.pieces_[1]
  • 如何从firestore中的数组中删除对象(How to delete object from array in firestore)
    问题 我在从firestore中的Array中删除Object时遇到问题。 我在firestore中有这些数据: 现在我想删除例如posts Array的第二个Object 。 代码: deletePic () { let docId = `${this.currentUser.uid}` fb.usersCollection.doc(docId).update({ posts: firebase.firestore.FieldValue.arrayRemove() }) .catch(function(error) { console.error("Error removing document: ", error); }); } 但我不知道如何定义arrayRemove() 这些是图片,每个都有一个删除按钮来删除图片。 回答1 您还可以使用 FieldValue 助手中的 arrayRemove 方法。 docRef.update({ array: FieldValue.arrayRemove('idToRemove'); }); https://firebase.googleblog.com/2018/08/better-arrays-in-cloud-firestore.html 回答2 编辑:警告不要使用我的解决方案,因为它已经超过 3 年了,现在有新的解决方案
  • Firebase 身份验证 Javascript:setCookie 用于重定向的待定凭据(Firebase Authentication Javascript: setCookie for pending Credential for redirect)
    问题 我正在尝试使用singinwithredirect获取多个身份验证链接。 我获取错误.credential并使用JSON.stringify通过 cookie 传递它。 从那里,我使用JSON.parse将其转换回对象,但是当我尝试将凭据对象传递给result.user.link(credential) ,它给了我一个错误说明: firebase.js:74 Uncaught Error: link failed: First argument "credential" must be a valid credential 我是否必须将 JSON 对象转换为 Firebase 对象才能在凭证中传递它? 对象最初的样子: Ef {accessToken: "EAAQmrlAUQpEBAL4oiPWEJy.......", provider: "facebook.com"} 从cookie ('string')转换回 JSON 后对象的样子: Object {accessToken: "EAAQmrlAUQpEBAL4oiPWEJy.......", provider: "facebook.com"} 回答1 完成后,您应该小心删除缓存的 accessToken 和 secret。 解析的 JSON 可能不是链接待处理凭据的有效 firebase 对象。 在链接之前
  • 删除单元格后刷新tableView(refresh tableView after deleting cell)
    问题 我有一个 tableView,其中包含从 Firebase 填充的数据,当我单击删除按钮时,数据将从 Firebase 中删除,但它保留在我的应用程序中,并且在我关闭应用程序并重新打开它之前它不会从 tableView 中删除数据。 这是我设置删除功能的方法: func deletePost() { let uid = FIRAuth.auth()!.currentUser!.uid let storage = FIRStorage.storage().reference(forURL: "gs://gsignme-14416.appspot.com") FIRDatabase.database().reference().child("posts").child(uid).observe(.childAdded, with: { (snapshot) in let indexPath = self.selectedIndex let post = self.posts[(indexPath?.row)!] as! [String: AnyObject] self.key = post["postID"] as? String self.itemsRef = FIRDatabase.database().reference().child("posts").child(uid
  • Firebase Firestore:从文档数组中追加/删除项目(Firebase Firestore: Append/Remove items from document array)
    问题 我正在尝试从 Firestore 文档内的数组中附加/删除项目,但每次替换整个数组而不是附加新值时。 我已经尝试了以下两种方法: batch.setData(["favorites": [user.uid]], forDocument: bookRef, options: SetOptions.merge()) batch.updateData(["favorites": [user.uid]], forDocument: bookRef) 我知道我可以使用对象/字典代替数组,但这意味着存储不相关的其他数据(例如密钥),我需要的只是存储在数组中的 ID。 这是 Firestore 目前可以实现的功能吗? 回答1 事实上,今天这是可能的。 随着最新更新db.collection.updateData方法实际上将新项目附加到数组而不是替换它。 示例用法可以在 Firebase 文档中找到。 如果您需要手动执行,则可以使用 FieldValue.arrayUnion([user.uid]) 回答2 更新数组中的元素 如果您的文档包含数组字段,您可以使用 arrayUnion() 和 arrayRemove() 添加和删除元素。 arrayUnion() 向数组添加元素,但只添加不存在的元素。 arrayRemove() 删除每个给定元素的所有实例。 let
  • 如何使用 Swift 从 UITableViewCell 中删除 Firebase 中的特定子节点(How can I delete a specific child node in Firebase from UITableViewCell using Swift)
    问题 我有一个UITableView看起来像这张图片 . 当我滑动删除记录时,我可以从存储它的数组中完全删除它,但我在 Firebase 中访问它以在那里删除它时遇到困难。 对于上面的屏幕截图,我的 Firebase 数据库结构如下: -KWc7RTuOe5PefiMM2tL bodyPart: "Arms" exerciseName: "Test 1 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcEbpw_f6kxcePY5cO bodyPart: "Chest" exerciseName: "Test 2 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcEdUN49QaJIVf0kwO bodyPart: "Legs" exerciseName: "Test 3 " userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" -KWcFrMSaLKQRxghGHyT bodyPart: "Arms" exerciseName: "Test 4" userId: "8rHmyTxdocTEvk1ERiiavjMUYyD3" 如何访问在创建时设置的 autoId 值,例如“-KWc7RTuOe5PefiMM2tL”,以便我可以删除该子节点? 或者
  • 通过一个值在 Firebase 中查找对象(Find object in Firebase by one value)
    问题 我有下一个数据库列表(用户名 + 用户 ID)。 如何通过用户 ID 找到对象并更改他的密钥(用户名)? 我在 Angular 5 中使用 AngularFire2。 回答1 您可以使用如下查询通过其值查找子节点: var users = firebase.database().reference("usernames"); var query = users.orderByValue().equalTo("Sk6I..."ltA2"); 通过将侦听器附加到此查询,您将能够找到与 UID 匹配的用户(或“任何用户”,因为从技术上讲可能有更多具有相同值的键)的引用和键。 但是您不能重命名节点。 您必须删除现有节点,然后创建一个新节点。 有关更多信息,请参见: Firebase:更新密钥? Firebase API 用于将树枝从一个集合移动到另一个集合是否可以重命名 Firebase 实时数据库中的键? 回答2 我的情况的解决方案: this.db.list('usernames', ref => ref.equalTo(uid)).remove() // Remove old value this.db.list('usernames', ref => ref.equalTo(uid)).set( username, uid ) // Create new value
  • 从Firebase移除物品(Remove Item from Firebase)
    问题 我正在尝试了解如何从Firebase中删除项目。 我已经设置了一个函数( createProvider )创建一个项目,但是无法弄清楚如何删除一个项目。 的HTML <form role="form" name="createProviderForm"> <input type="text" ng-model="title"> <button type="submit" ng-click="createProvider()">Submit</button> </form> <div ng-repeat="provider in providers"> <h3>{{ provider.title }}</h3> <button type="button" ng-click="removeProvider()">Remove</button> </div> </div> JS var rootRef = new Firebase(FBURL); var providersRef = rootRef.child('providers'); $scope.newProvider = {}; $scope.providers = []; providersRef.on('child_added', function(snapshot) { $timeout(function() {
  • Firebase和后端逻辑(Firebase and backend logic)
    问题 我是parse.com用户,现在我正在寻找其他服务。 如何将后端逻辑写到Firebase? 假设我要验证服务器端的所有值,或触发事件。 我考虑了一个解决方案,但我想知道推荐的方法。 我想 创建使用express的nodejs服务器。 创建中间件来处理逻辑。 从应用程序发送休息请求,从而触发中间件使用firebase的nodejs sdk根据http请求的参数更新值。 并在侦听更改的应用程序Firebase处理程序上实现 他们更简单的东西? 在解析中,我使用了云代码,我希望逻辑不会在客户端,而在服务器端。 回答1 更新(2017年3月10日) :虽然我在下面概述的体系结构仍然有效,并且可以用于将Firebase与任何现有基础结构结合起来,但是Firebase刚刚发布了Cloud Functions for Firebase,它允许您在Google的服务器上运行JavaScript函数以响应Firebase事件(例如数据库更改,用户登录等)。 Firebase应用程序的通用体系结构在此博客文章中定义非常明确,Firebase在您的应用程序中适合哪里? 您提出的体系结构最接近体系结构3,在该体系结构中,您的客户端代码既直接与Firebase对话,又与Node.js服务器直接对话。 我还强烈建议您考虑选项2,其中客户端和服务器之间的所有交互都通过Firebase运行。
  • 我想在 JavaScript 中单击按钮时从 Firebase 实时数据库中删除项目(I want to delete items from Firebase realtime database on button click in JavaScript)
    问题 我想通过单击 JavaScript 中的按钮从 Firebase 实时数据库中删除该项目。 我怎样才能删除它? 我收到此错误:app.js:61 Uncaught ReferenceError: the key is not defined in console。 我已经在 jsfiddle 上上传了我的完整代码。 我的错误在哪里? https://jsfiddle.net/waqasumer/z7wt6d0e/7/ var main = document.getElementById("main-section"); function saveData() { var todoItem = document.getElementById("todo-item"); if (todoItem.value === "") { alert("Please enter task"); } else { var key = firebase.database().ref('tasks').push().key; var tasks = { todoItem: todoItem.value, key: key } firebase.database().ref('tasks/' + key).set(tasks); document.getElementById("todo-item"
  • 在firebase中覆盖的对象(Object overwritten in firebase)
    问题 从谷歌表发送的数据: 用于将数据从 google sheet 发送到 firebase 的脚本。 函数写入数据(){ var ss = SpreadsheetApp.openById("####"); var sheet = ss.getSheets()[0]; var data = sheet.getDataRange().getValues(); var dataToImport = {}; for(var i = 1; i < data.length; i++) { var department = data[i][0]; var year = data[i][1]; var course = data[i][2]; dataToImport[department] = {}; dataToImport[department][year] = {} dataToImport[department][year][course] = {} dataToImport[department][year][course][i] = { course: data[i][3], dateAdded: data[i][4], fileSize: data[i][5], fileType:data[i][6], downloadLink: data[i][7], }; } var
  • Firebase 在 javascript 中查询和删除数据(Firebase query and delete data in javascript)
    问题 这是我的火力基地 我想删除契约中的最后一个契约,它恰好是契约 id: 1. 我想在不指定任何东西的情况下删除契约中的最后一个契约。 这是我已经尝试过的,但我没有收到任何函数错误,因为我正在返回查询类型对象。 const deedRef = admin.database().ref('/deeds'); deedRef.limitToLast(1).once("value", (snapshot) => { snapshot.val().remove(); }) 和 const deedRef = admin.database().ref('/deeds'); deedRef.limitToLast(1).once("value", (snapshot) => { snapshot.forEach((deedSnapshot) =>{ deedSnapshot.remove(); }) }) 我试过这个 const deedRef = admin.database().ref('/deeds'); deedRef.limitToLast(1).remove(); 如何在契约中引用最后一个契约并将其删除? 最后的行为会不断变化。 回答1 你正在接近: const deedRef = admin.database().ref('/deeds'); deedRef
  • 如何从firebase中删除条目(How to delete entries from firebase)
    问题 我正在探索 Firebase 的功能,我在如何使用 java 代码从 firebase 中删除节点或条目时遇到问题? 我搜索了他们的 API .. web 版本确实提供了 remove() 函数,但 java 没有?! 回答1 Firebase对象上有一个removeValue()方法: 文档 将位置的值设置为null实质上是从结构中删除节点。 回答2 尽管@jsfrocha 的回答是完全正确的,但重要的是要注意,如果您正在使用事务,这是删除数据时的一个好习惯,您可以通过 MutableData 对象访问数据,在这种情况下,您没有removeValue(...)方法,所以你应该使用setValue(null)代替。 这是一个剪断的... firebase.child(path).runTransaction(new Transaction.Handler() { public Transaction.Result doTransaction(MutableData mutableData) { mutableData.setValue(null); // This removes the node. return Transaction.success(mutableData); } public void onComplete(FirebaseError error
  • 未显示 Angular FIrebase 5 对象键。 所以不能删除(Angular FIrebase 5 objects keys not being displayed. So can't delete)
    问题 这个问题已经得到了回答,但我正在寻找一个,嗯,如果有的话,更直接。 奇怪的是,我们必须实现不是一个而是两个映射才能访问对象键。 basic firebase db:可以看出,课程对象显然有键。 标记: <ul> <li *ngFor="let course of courses$ | async"> <b>Key:</b> {{course.$key}} <!-- doesn't show --!> <b>Title:</b> {{course.Title}} <b>Duration:</b> {{course.Duration}} <b>Author:</b> {{course.Author}} <p><button (click)="deleteCourse(course)">Remove</button></p> <hr> </li> </ul> 现在,课程显示得很好,但我不知道如何获取对密钥的引用以将其删除。 (或者也许我没有在我的 firebaseDatabase 对象上使用正确的方法)。 无论哪种方式,当我在控制台中记录密钥时,它都显示为未定义。 export class AppComponent { courses; courses$: AngularFireList<any>; constructor(private db
  • 如何按计划从 Firebase 数据库中删除数据(How to delete data from a Firebase database on a schedule)
    问题 我创建了一个简单的类似聊天室的 Apache Cordova (HTML) 应用程序,它允许用户在聊天室中使用自定义用户名添加自己的消息。 消息在一段时间后加起来,我必须每天进入实际数据库删除它们以避免混乱。 有什么办法可以创建规则或javascript函数来每天在特定时间清除数据? 例如,在上午 9 点,数据库将清除前一天和晚上的所有内容,并重新开始新的一天。 谢谢您的帮助。 回答1 从它的外观来看,目前有两种类似的解决方案:在 JavaScript 中创建计划任务 || later.js 按计划执行函数? 我不熟悉later.js,所以我无法帮助你。 使用 gdoron 的代码,我相信代码应该类似于: function foo(){ var day =new Date().getDay(); var hours =new Date().getHours(); if (day === 0 && hours >12 && hours < 13) // day is a 0 index base // sunday between 12:00 and 13:00 //What you want to do goes here var fredRef = new Firebase('yourDirectoryUrl') fredRef.remove(); }
  • 如何绕过Firebase缓存以刷新数据(在Android应用中)?(How to bypass the Firebase cache to refresh data (in Android app)?)
    问题 在大多数必须离线运行的Android应用程序上,当我在线时,我需要对ie进行一些同步操作: User myUser = MyclientFacade.getUser(); If (myUser.getScore > 10) { DoSomething() } 其中User是由Firebase填充的POJO; 激活Firebase缓存时,会出现问题 Firebase.getDefaultConfig().setPersistenceEnabled(true); 并且用户已经在缓存中,并且第三方(甚至其他设备)在Firebase DB上更新了数据。 确实,当我查询Firebase来获取用户时,我首先从缓存中获取了数据,然后又从Firebase服务器中获取了包含最新数据的第二个change事件,但是为时已晚! 让我们看看同步方法MyclientFacade.getUser(): Public User getUser() { Firebase ref = myFireBaseroot.child("User").child(uid); ref.keepSynced(true); /* try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }*/ final