angularjs - instalar - firebase angular 6
La base de datos de AngularJS Firebase actualiza un campo por casilla de verificación (3)
Quiero actualizar los datos en una tabla que muestra la base de datos de Firebase.
Cada línea en la tabla representa los datos de un usuario en particular. Mi objetivo es poder actualizar los datos en un campo de datos de un usuario. En este ejemplo, estoy tratando de cambiar la función del usuario en función de una casilla de verificación ng-true-value="''admin''" ng-false-value="''user''"
.
¿Cómo puedo obtener el ID de usuario de la línea que estoy editando / actualizando la información y pasarla a la función de actualización? actualmente el código está tomando la identificación de usuario actual.
La función que uso para actualizar la información del usuario es:
$scope.updateRole= function () {
var updated_user_info= {
role: $scope.user.role
};
var myuser = firebase.auth().currentUser;//change this part?!
DatabaseRef.ref(''users/'' + myuser.uid).update(updated_user_info)
.then(function () {
console.log("update success");
}).catch(function (error) {
$scope.errMsg = true;
$scope.errorMessage = error.message;
});
}
la vista html:
<tr ng-repeat="obj in $data">
<td data-title="''First Name''" filter="{ ''First Name'': ''text'' }" sortable="''firstName''">{{ obj.firstName }}</td>
<td data-title="''Last Name''" filter="{ ''Last Name'': ''text'' }" sortable="''lastName''">{{ obj.lastName }}</td>
<td data-title="''Role''" filter="{ ''Role'': ''text'' }" sortable="''role''">
<input type="checkbox" ng-model="user.role" ng-true-value="''admin''" ng-false-value="''user''" ng-click="updateRole()">
{{obj.role}}
</td>
</tr>
Actualmente solo está actualizando el usuario actual y también mantiene un valor comprobado para todos los usuarios, pero no actualiza, solo el usuario actual.
Como se indica en otra respuesta, es porque solo está actualizando un usuario. Ya tiene el usuario que desea actualizar con el ''obj'' de su ng-repeat, por lo que no es necesario volver a llamar a la base de datos para obtener el usuario que desea actualizar.
De los documentos de Firebase: "También puede obtener el usuario actualmente conectado utilizando la propiedad actualUsuario". Según esta lógica, el usuario actual siempre será el que esté editando la casilla de verificación, y estoy seguro de que no desea que los usuarios se hagan administradores.
<input type="checkbox" ng-model="user.role"
ng-true-value="''admin''" ng-false-value="''user''" ng-click="updateRole(obj.uid)">
Y tu js debería verse como
$scope.updateRole = function(userId) {
var updated_user_info= {
role: $scope.user.role
};
DatabaseRef.ref(''users/'' + userId).update(updated_user_info)
.then(function () {
console.log("update success");
}).catch(function (error) {
$scope.errMsg = true;
$scope.errorMessage = error.message;
});
}
}
Esto se debe a que se refiere al usuario actual en cualquier actualización que haga a la base de datos DatabaseRef.ref(''users/'' + myuser.uid).update(updated_user_info)
está actualizando el mismo usuario todo el tiempo, necesita obtener la identificación del usuario que desea actualizar. algo como esto:
<td data-title="''Role''" filter="{ ''Role'': ''text'' }" sortable="''role''">
<input type="checkbox" ng-model="user.role" ng-true-value="''admin''" ng-false-value="''user''" ng-click="updateRole(obj.uid)">
{{obj.role}}
</td>
Y reciba la identificación en su función
$scope.updateRole= function (userid) {
var updated_user_info= {
role: $scope.user.role
};
DatabaseRef.ref(''users/'' + userid).update(updated_user_info)
.then(function () {
console.log("update success");
}).catch(function (error) {
$scope.errMsg = true;
$scope.errorMessage = error.message;
});
}
Si fuera usted, usaría la directiva ng-change
lugar de ng-click
. La directiva ng-change
activa cada vez que cambia el valor de la casilla de verificación.
HTML
<input type="checkbox" ng-model="user.role" ng-change="updateRole(user)" ng-true-value="''admin''" ng-false-value="''user''">
Como puede ver en el HTML anterior, podemos pasar el modelo de usuario a nuestra función updateRole y manejar el resto desde allí.
JS
$scope.updateRole= function (user) {
var updated_user_info= {
role: user.role
};
DatabaseRef.ref(''users/'' + user.uid).update(updated_user_info)
.then(function () {
console.log("update success");
}).catch(function (error) {
$scope.errMsg = true;
$scope.errorMessage = error.message;
});
}
Como puede ver, su función de actualización ha cambiado un poco. Ahora puede obtener el uid
del objeto de user
y continuar.