Angularfire2从具有相同ID

时间:2017-04-08 10:32:38

标签: angular firebase angularfire2

我有使用Angular 2和Firebase的预订应用程序,使用Angularfire 2.预订完成后,我在Firebase中创建了2个节点。单个条目共享相同的orderID,如下所示:

Bookings Node Orders Node

节点1:预订 节点2:订单

我必须这样帮助其他功能。

当我从应用程序中删除(删除)订单时,我无法使用匹配的ID删除Orders Node and Bookings节点中的特定条目。仅从订单节点中删除。

这是带有删除功能的HTML按钮:

<button class="btn btn-sm btn-danger" type="button" (click)="orderDelete(order.$key)"><em class="fa fa-trash-o"></em></button>

以下是构造函数访问Firebase中的订单节点:

    constructor(public af: AngularFire, public toastr: ToastrService, public router: Router) {
    this.ordersData = af.database.list('/orders');
    this.ordersData.subscribe((res) => {
      this.orders = res;
      console.log(this.orders)
    });
  }

这是我点击删除时删除订单时运行的功能:

 orderDelete(key) {
    if (confirm('Are you sure you want to delete this?')) {
      this.ordersData.remove(key).then((res) => {
        this.toastr.success('Order Deleted Successfully!', 'Success!');
      })
    }
  }

我需要弄清楚,当我删除订单时,(工作正常)它将删除预订节点中具有匹配ID的条目。

我不确定是否必须在构造函数中进行查询以获取预订和订单输入并首先匹配ID,然后删除该结果?

任何帮助都会很棒,谢谢。

更新:24小时后Alomost我仍然无法解决这个问题,您认为这样的事情会起作用吗?在哪里我运行查询以尝试从预订节点&#39;中删除预订。谁是&#39; orderId&#39;匹配&#39; orderId&#39;来自订单&#39;的数据节点?请原谅我,如果这很荒谬,我已经尝试了一切来实现这一点,我正在努力尝试让这一切发挥作用。

this.toDelete = af.database.list('/bookings', {
      query: {
        orderByChild: 'orderId',
        equalTo: ordersData.orderId 
      }
    });

更新:仍然没有进展,我现在尝试的是orderDelete()函数中的以下内容。

 orderDelete(key) {
    if (confirm('Are you sure you want to delete this?')) {

      const bookings = this.af.database.list('/bookings', {
      preserveSnapshot: true,
      query: {
        orderByChild: 'orderId',
        equalTo: this.orderId
      }
    });
    bookings.subscribe(snapshots=>{
        snapshots.forEach(snapshot => {
          snapshot.ref.remove();
        });
    })

      this.ordersData.remove(key).then((res) => {
        this.toastr.success('Order Deleted Successfully!', 'Success!');
      })
    }
  }

我的想法是先查询预订,然后在预订中查询orderId,然后尝试删除与此订单相关的预订,但这也不起作用。

<小时/> 更新:仍然没有运气,我现在已经尝试过了。

我决定在html中添加另一个点击功能,如:

(click)="orderDelete(order.$key); bookingDelete(booking.$key)"

因此,我不想仅运行orderDelete函数来删除订单,而是想我是否可以复制可能有效的预订节点的函数。所以我也在我的TS文件中这样做了:

   orderDelete(key) {
    if (confirm('Are you sure you want to delete this?')) {
      this.ordersData.remove(key).then((res) => {
        this.toastr.success('Order Deleted Successfully!', 'Success!');
      })
    }
  }

  bookingDelete(key) {
    if (confirm('Are you sure you want to delete this?')) {
      this.bookingData.remove(key).then((res) => {
        this.toastr.success('Booking Deleted Successfully!', 'Success!');
      })
    }
  }

所以,它确实使用orderDelete(key)函数删除了orders节点中的特定顺序,但是bookingDelete(key)函数完全删除整个预订节点而不是删除所选项目:(

我想回到绘图板。

我不知道为什么在运行orderDelete函数时会删除所选项目以及为什么在运行bookingDelete函数时会删除节点中的所有预订?

更新:我想我已经做到了!!

我使用了代码,我唯一做的就是更改2个函数,所以我仍在运行HTML中的click操作中的2个函数。这就是我所做的:

 orderDelete(key) {
    this.selectedBooking = {
        orderId : key.orderId
      }

    if (confirm('Are you sure you want to delete this?')) {
      this.ordersData.remove(key).then((res) => {
        this.toastr.success('Order Deleted Successfully!', 'Success!');
      })
    }
  }




  bookingDelete(orderId){
        this.af.database.list('/bookings', {
        query:{
            orderByChild: 'orderId',
            equalTo: orderId
          }
       }).subscribe(res=>{
           let key = res[0].$key;
           this.bookingData.remove(key)
       });
    }

我在构造函数的顶部创建了一个名为selectedBooking的null值的变量,如下所示:selectedBooking = null; 在orderDelete()函数中,我分配了&#39; key.orderId&#39;到orderId变量。然后我将这个新的orderId变量作为参数传递给了bookingDelete()函数,并添加了一个查询来查询orderId,它等于传递的orderId然后运行remove函数。

我甚至不知道这段代码是否100%正确,但是它起作用并从预订节点和订单节点中删除了预订和匹配订单。

如果您认为代码可能存在问题,请告诉我们。

谢谢,我希望无论如何这可以帮助别人:)

0 个答案:

没有答案