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

时间:2016-11-09 00:06:00

标签: angularjs firebase firebase-realtime-database firebase-authentication angular-ngmodel

我想更新显示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>

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

3 个答案:

答案 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)">