angularjs - firestore - AngularFire-Eliminar elemento único
firebase angular 5 (5)
Aquí está el código relevante en mi opinión:
p(ng-repeat="t in todos")
input(
type="checkbox",
ng-model="t.done",
ng-click="clearItem($event)"
)
{{t.text}} done? {{t.done}}
Cuando se hace clic en la casilla de verificación, quiero que el objeto apropiado en la matriz de todos
se elimine de la base de datos.
Mi función clearItem
es la siguiente:
$scope.clearItem = function(event) {
todoRef.remove($scope.t);
}
Sin embargo, esto elimina todas las entradas en mi base de datos. Quiero que elimine solo el objeto específico en cuestión. ¿Hay alguna forma de que haga esto?
Ok, lo descubrí.
Cuando buclee usando ng-repeat
, use (id, t) in todos
. Esto le permite enviar id
como parámetro a la función ng-click
, y $scope.todos.$remove(id)
funciona bien.
Una mejor solución sería tener $scope.clearItem()
tomar el objeto t
como un argumento, en lugar de $event
.
HTML - <p ng-repeat="t in todos"><input... ng-click="clearItem(t)">
JS - $scope.clearItem = function(obj) {todoRef.$remove(obj)};
La única forma en que puedo eliminar el elemento es usando un bucle en la matriz que obtenemos de firebase.
var ref= new Firebase(''https://Yourapp.firebaseio.com/YourObjectName'');
var arr_ref=$firebaseArray(ref);
for(var i=0;i<arr_ref.length;i++){
if(key==arr_ref[i].$id){
console.log(arr_ref[i]);
arr_ref.$remove(i);
}
}
La forma más fácil de eliminar el objeto sería
scope.clearItem = function(event) {
todoRef.$loaded().then(function(){
todoRef.$remove($scope.t)
});
La naturaleza asincrónica de la bestia me ha conseguido algunas veces.
Para proporcionar un ejemplo más completo para cualquier persona que aterrice aquí, de acuerdo con la documentación de Firebase para AngularFire, esta sería la forma preferida, y creo que es la manera más fácil de eliminar un objeto:
// Create an app. Synch a Firebase array inside a controller
var myApp = angular.module("myApp", ["firebase"]);
// inject $firebaseArray
myApp.controller("TodoCtrl", ["$scope", "$firebaseArray", function($scope, $firebaseArray) {
// bind $scope.todos to Firebase database
$scope.todos = $firebaseArray(myFirebaseRef.child("todo"));
// create a destroy function
$scope.removeTodo = function(todo) {
$scope.todos.$remove(todo);
};
}]);
En su opinión, podría hacer algo como a continuación. Tenga en cuenta que puede vincular la función removeTodo a una casilla de verificación como especifica la pregunta, o un elemento antiguo normal de <a href>
:
// In your view
<div ng-controller="TodoCtrl">
<ul>
<li ng-repeat="todo in todos">
{{ todo.text }} : <a href ng-click="removeTodo(todo)">X</a>
</li>
</ul>
</div>
¡Espero que ayude!