【问题标题】:AngularJS Firebase database update a field by checkboxAngularJS Firebase 数据库通过复选框更新字段
【发布时间】: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>

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

【问题讨论】:

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


    【解决方案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;
                });
            }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-20
          • 2014-03-03
          • 2011-06-23
          • 2014-03-22
          • 2014-07-09
          • 2016-05-16
          • 1970-01-01
          • 2011-05-13
          相关资源
          最近更新 更多