AngularJS Firebase 数据库通过复选框更新字段

AngularJS Firebase database update a field by checkbox

我想更新显示 Firebase 数据库的 table 中的数据。

table 中的每一行代表一个特定用户的数据。我的目标是能够更新用户数据的一个字段中的数据。在此示例中,我试图根据复选框 ng-true-value="'admin'" ng-false-value="'user'" 更改用户角色。

如何获取我所在行的用户 ID editing/updating 信息并将其传递到更新函数中?目前代码正在使用当前用户 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>

目前它只更新当前用户,并为所有用户维护一个检查值,但不更新,只更新当前用户本身。

那是因为你在对数据库进行任何更新时都指的是当前用户 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;
        });
    }

如另一个答案所述,这是因为您只会更新一个用户。您已经有了要使用 ng-repeat 中的 'obj' 更新的用户,因此无需再次调用数据库来获取要更新的用户。

来自 Firebase 的文档:"You can also get the currently signed-in user by using the currentUser property." 按照这种逻辑,当前用户将始终是编辑复选框的用户,我相信您不希望用户将自己设为管理员。

<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;
        });
    }
}

如果我是你,我会使用 ng-change 指令而不是 ng-clickng-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 并继续。