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 和 Firebase 与用户传输项目

无法在 angularjs App 中配置 Firebase 云消息传递。

使用 Angularjs 和 Firebase 构建聊天应用程序

如何在 AngularJS 和 FireBase 中进行简单的基于角色的授权?

得到错误的结果:从 AngularJS 访问 api 并使用 NodeJS 从 firebase 查询结果时出现时区问题