AngularJS Firebase 数据库通过复选框更新字段
AngularJS Firebase database update a field by checkbox
我想更新显示 Firebase 数据库的 table 中的数据。
table 中的每一行代表一个特定用户的数据。我的目标是能够更新用户数据的一个字段中的数据。在此示例中,我试图根据复选框 ng-true-value="'admin'" ng-false-value="'user'"
更改用户角色。
如何获取我所在行的用户 ID editing/updating 信息并将其传递到更新函数中?目前代码正在使用当前用户 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>
目前它只更新当前用户,并为所有用户维护一个检查值,但不更新,只更新当前用户本身。
那是因为你在对数据库进行任何更新时都指的是当前用户 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;
});
}
如另一个答案所述,这是因为您只会更新一个用户。您已经有了要使用 ng-repeat 中的 'obj' 更新的用户,因此无需再次调用数据库来获取要更新的用户。
来自 Firebase 的文档:"You can also get the currently signed-in user by using the currentUser property." 按照这种逻辑,当前用户将始终是编辑复选框的用户,我相信您不希望用户将自己设为管理员。
<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;
});
}
}
如果我是你,我会使用 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
并继续。
我想更新显示 Firebase 数据库的 table 中的数据。
table 中的每一行代表一个特定用户的数据。我的目标是能够更新用户数据的一个字段中的数据。在此示例中,我试图根据复选框 ng-true-value="'admin'" ng-false-value="'user'"
更改用户角色。
如何获取我所在行的用户 ID editing/updating 信息并将其传递到更新函数中?目前代码正在使用当前用户 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>
目前它只更新当前用户,并为所有用户维护一个检查值,但不更新,只更新当前用户本身。
那是因为你在对数据库进行任何更新时都指的是当前用户 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;
});
}
如另一个答案所述,这是因为您只会更新一个用户。您已经有了要使用 ng-repeat 中的 'obj' 更新的用户,因此无需再次调用数据库来获取要更新的用户。
来自 Firebase 的文档:"You can also get the currently signed-in user by using the currentUser property." 按照这种逻辑,当前用户将始终是编辑复选框的用户,我相信您不希望用户将自己设为管理员。
<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;
});
}
}
如果我是你,我会使用 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
并继续。