8

我想更新显示Firebase数据库的表中的数据。AngularJS Firebase数据库通过复选框更新字段

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

如何获取我正在编辑/更新信息的行的用户标识并将其传递到更新函数中?目前代码正在获取当前用户标识。

我用它更新用户信息的功能是:

$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

那是因为你指的是你做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; 
     }); 
    } 
1

正如另一个答案说,那是因为你永远只更新一个用户。您已经拥有想要使用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

如果我是你,我会用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并继续。