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並繼續。

相關問題