我想更新显示Firebase数据库的表格中的数据。
表中的每一行代表一个特定用户的数据。我的目标是能够更新用户数据的一个字段中的数据。在此示例中,我尝试根据复选框ng-true-value="'admin'" ng-false-value="'user'"
更改用户角色。
如何获取我正在编辑/更新信息的行的用户ID并将其传递给更新功能?目前代码正在获取当前用户ID。
我使用它的功能更新用户信息是:
$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;
});
}
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>
目前它只更新当前用户,并且还为所有用户维护一个检查值,但不更新,只保留当前用户本身。
答案 0 :(得分:3)
如果我是你,我会使用ng-change
指令代替ng-click
。每次复选框值更改时,ng-change
指令都会触发。
HTML
<input type="checkbox" ng-model="user.role" ng-change="updateRole(user)" ng-true-value="'admin'" ng-false-value="'user'">
正如您在上面的HTML中看到的,我们可以将用户模型传递给我们的updateRole函数,并从那里处理其余部分。
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;
});
}
正如您所看到的,您的更新功能已经发生了一些变化。现在,您可以从uid
对象获取user
并继续。
答案 1 :(得分:1)
这是因为您指的是对数据库DatabaseRef.ref('users/' + myuser.uid).update(updated_user_info)
所做的任何更新的当前用户,您要一直更新同一个用户,您需要从要更新的用户那里获取ID。像这样的东西:
<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>
并在您的函数中接收id
$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;
});
}
答案 2 :(得分:1)
正如另一个答案所述,这是因为你只是在更新一个用户。您已经拥有要使用ng-repeat中的'obj'更新的用户,因此无需再次调用数据库来获取要更新的用户。
来自Firebase的文档:“您还可以使用currentUser属性获取当前登录的用户。”通过这种逻辑,当前用户将始终是编辑复选框的用户,并且我确信您不希望用户自己管理员。
Retry
你的js看起来应该是
<input type="checkbox" ng-model="user.role"
ng-true-value="'admin'" ng-false-value="'user'" ng-click="updateRole(obj.uid)">