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), вы все время обновляете одного и того же пользователя, вам нужно получить идентификатор от пользователя, которого хотите обновить. что-то вроде этого:

<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> 

и получить идентификатор в функции

$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

Как сказано в другом ответе, это потому, что вы только когда-либо обновление одного пользователя. У вас уже есть пользователь, которого вы хотите обновить с помощью «obj» из вашего ng-repeat, поэтому нет необходимости снова вызывать базу данных, чтобы получить пользователя, которого вы хотите обновить.

Из документов 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; 
    }); 

} 

Как вы можете видеть вашу функцию обновления немного изменился. Теперь вы можете получить uid с объекта user и продолжить.