AngularJS Firebase 数据库通过复选框更新字段
Posted
技术标签:
【中文标题】AngularJS Firebase 数据库通过复选框更新字段【英文标题】:AngularJS Firebase database update a field by checkbox 【发布时间】:2017-03-22 18:18:06 【问题描述】:我想更新显示 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>
目前它只更新当前用户,并为所有用户维护一个检查值,但不更新,只更新当前用户本身。
【问题讨论】:
【参考方案1】:如果我是你,我会使用 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;
);
如您所见,您的更新功能发生了一些变化。现在您可以从user
对象中获取uid
并继续。
【讨论】:
【参考方案2】:正如另一个答案中所述,这是因为您只更新了一个用户。您已经有了要使用 ng-repeat 中的“obj”更新的用户,因此无需再次调用数据库来获取要更新的用户。
来自 Firebase 的文档:“您还可以使用 currentUser 属性获取当前登录的用户。”按照这种逻辑,当前用户将始终是编辑复选框的用户,我敢肯定您不希望用户自己成为管理员。
<input type="checkbox" ng-model="user.role"
ng-true-value="'admin'" ng-false-value="'user'" ng-click="updateRole(obj.uid)">
你的 js 应该是这样的
$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;
);
【讨论】:
【参考方案3】:那是因为您在对数据库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;
);
【讨论】:
以上是关于AngularJS Firebase 数据库通过复选框更新字段的主要内容,如果未能解决你的问题,请参考以下文章
使用 AngularJS 和 Firebase 与用户传输项目
无法在 angularjs App 中配置 Firebase 云消息传递。
使用 Angularjs 和 Firebase 构建聊天应用程序
如何在 AngularJS 和 FireBase 中进行简单的基于角色的授权?
得到错误的结果:从 AngularJS 访问 api 并使用 NodeJS 从 firebase 查询结果时出现时区问题