2014-10-23 37 views
28

Tôi đang sử dụng Firebase cho ứng dụng web. Nó được viết bằng Javascript đơn giản bằng cách sử dụng không có thư viện bên ngoài.Cách xóa/xóa các nút trên Firebase

Tôi có thể "đẩy" và truy xuất dữ liệu bằng '.on ("child_added")', nhưng '.remove()' không hoạt động theo cách mà nó nói. Theo API,

"Firebase.remove() - Hủy bỏ các dữ liệu tại địa điểm căn cứ hỏa lực này Mọi dữ liệu tại các địa điểm đứa trẻ cũng sẽ bị xóa Hiệu quả của xóa sẽ được hiển thị ngay lập tức..."

Tuy nhiên, việc xóa không xảy ra ngay lập tức; chỉ khi toàn bộ kịch bản được thực hiện đang chạy. Tôi cần phải loại bỏ và sau đó sử dụng cây bị xóa ngay sau đó.

Ví dụ mã:

ref = new Firebase("myfirebase.com") //works 
ref.push({key:val}) //works 

ref.on('child_added', function(snapshot){ 
//do stuff 
}); //works 

ref.remove() 
//does not remove until the entire script/page is done 

Có một bài tương tự here nhưng tôi không sử dụng các thư viện Ember, và ngay cả như vậy nó có vẻ như một cách giải quyết cho những gì nên càng đơn giản như API giải thích nó được.

+1

Khá rõ ràng những gì bạn cho là sai ở đây. Xóa() hoạt động tốt. Bạn đang thực hiện rất nhiều hoạt động không đồng bộ ở đây và dường như cho rằng chúng đồng bộ (gợi ý: không đảm bảo thứ tự những sự kiện đó sẽ diễn ra trừ khi bạn sử dụng gọi lại thành công để kích hoạt sự kiện tiếp theo) – Kato

Trả lời

56

Vấn đề là bạn gọi remove trên thư mục gốc của căn cứ hỏa lực của bạn:

ref = new Firebase("myfirebase.com") 
ref.remove(); 

này sẽ không làm việc, bởi vì bạn không thể xóa toàn bộ một căn cứ hỏa lực thông qua API.

Bạn có thể xóa bất kỳ trẻ em nào trong đó.

ref.child(key).remove(); 
+7

Bạn có thể gọi remove() trên thư mục gốc của phiên bản Firebase miễn là các quy tắc bảo mật cho phép điều này. Tôi chỉ thử nghiệm để chắc chắn rằng không có gì có thể xảy ra ở đây; nó hoạt động tốt. – Kato

+0

Woops ... Phục vụ tôi không thử nghiệm. Tôi sẽ cập nhật câu trả lời của mình khi tôi lại có bàn phím tốt hơn. –

+0

Loại bỏ nó trong trường hợp đó là gì? Tất cả trẻ em (vì vậy tất cả dữ liệu ** trong ** ứng dụng)? Hay nó tự xóa ứng dụng, như khi bạn nhấp vào "xóa" khỏi bảng điều khiển Firebase (https://www.firebase.com/account/)? –

4

Firebase.remove() như lẽ phương pháp căn cứ hỏa lực nhất là không đồng bộ, do đó bạn phải lắng nghe các sự kiện để biết khi nào một cái gì đó đã xảy ra:

parent = ref.parent() 
parent.on('child_removed', function (snapshot) { 
    // removed! 
}) 
ref.remove() 

Theo tài liệu căn cứ hỏa lực nó sẽ hoạt động ngay cả khi bạn kết nối mạng lỏng lẻo. Nếu bạn muốn biết khi nào sự thay đổi đã được thực sự đồng bộ với máy chủ căn cứ hỏa lực, bạn có thể vượt qua một hàm callback để Firebase.remove phương pháp:

ref.remove(function (error) { 
    if (!error) { 
     // removed! 
    } 
} 
6

Như những người khác đã ghi nhận cuộc gọi đến .remove() là không đồng bộ. Tất cả chúng ta đều nên biết không có gì xảy ra 'ngay lập tức', ngay cả khi nó ở tốc độ ánh sáng.

Ý của bạn là 'ngay lập tức' là dòng mã tiếp theo sẽ có thể thực hiện sau khi gọi tới .remove(). Với các hoạt động không đồng bộ dòng tiếp theo có thể là khi dữ liệu đã được xóa, nó có thể không - nó hoàn toàn không có cơ hội và lượng thời gian đã trôi qua.

.remove() lấy một tham số một chức năng gọi lại để giúp giải quyết tình huống này để thực hiện các hoạt động sau khi chúng tôi biết rằng thao tác đã được hoàn thành (có hoặc không có lỗi). .push() nhận hai tham số, giá trị và gọi lại giống như .remove().

Dưới đây là ví dụ mã của bạn với những thay đổi:

ref = new Firebase("myfirebase.com") 

ref.push({key:val}, function(error){ 
    //do stuff after push completed 
}); 

// deletes all data pushed so far 
ref.remove(function(error){ 
    //do stuff after removal 
}); 
+0

là bạn SURE bạn "// làm các chất liệu" trong "lỗi" gọi lại? – Cerberus

+0

hey @Cerberus - tbh bây giờ im không chắc chắn. Tôi đã ngừng sử dụng fbase sau khi mua google. plz chỉnh sửa câu trả lời nếu nó không đúng, hoặc tham khảo tài liệu mới –

+1

được thực hiện, nhưng nó giống như "bộ sưu tập của bạn" hơn "cơ sở của bạn", có thể là toàn bộ cơ sở ... Chúc mừng @DavidAnderton – Cerberus

1

Để loại bỏ một kỷ lục.

var db = firebase.database();     
var ref = db.ref(); 
var survey=db.ref(path+'/'+path); //Eg path is company/employee     
survey.child(key).remove();   //Eg key is employee id 
Các vấn đề liên quan