Foreach 与 Firebase
Foreach with firebase
var myApp = angular.module("myApp", ["firebase"]);
var nick = prompt("Anna nimesi");
myApp.controller("MyController", ["$scope", "$firebaseArray",
function($scope, $firebaseArray) {
var msgref = new Firebase("https://(myapp).firebaseio.com/messages");
var usrref = new Firebase("https://(myapp).firebaseio.com/users");
$scope.messages = $firebaseArray(msgref);
$scope.users = $firebaseArray(usrref);
console.log($scope.users);
console.log($scope.messages);
var taken = false;
angular.forEach($scope.users, function(value, key) {
console.log(value, key);
if (value.username == nick) {
taken = true;
}
// put your code here
});
if (taken == false) {
$scope.users.$add({
username: nick
});
};
$scope.addMessage = function(e) {
if (e.keyCode == 13 && $scope.msg) {
var name = nick || "anynomous";
$scope.messages.$add({
from: name,
body: $scope.msg
});
$scope.msg = "";
}
}
}
])
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
<title>title</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script src="https://cdn.firebase.com/js/client/2.2.4/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/1.1.1/angularfire.min.js"></script>
</head>
<body ng-controller="MyController">
<div class="example-chat l-demo-container">
<ul id="example-messages" class="example-chat-messages">
<li ng-repeat="msg in messages">
<strong class="example-chat-username">{{msg.from}}</strong>
{{msg.body}}
</li>
</ul>
</div>
<input class="input" autofocus="true" ng-model="msg" ng-keydown="addMessage($event)" type="text" id="messageInput" placeholder="kirjota">
<script src="script.js"></script>
</body>
</html>
我正在聊天,我想检查是否已经有一个同名的用户,这样就不能有两个用户具有相同的昵称。这不起作用,我可以添加许多相同的刻痕。
var usrref = new Firebase("https://(myapp).firebaseio.com/users");
$scope.users = $firebaseArray(usrref);
var taken = false;
for (var usr in $scope.users) {
if(usr.username == nick){
taken = true;
};};
if(taken == false){
$scope.users.$add({username:nick});
};
我的消息在 html 中使用 ng-repeat 完美显示,但我无法完成这项工作。这显然很简单,但我为此苦苦挣扎了太久。
A for (var ... in ...)
遍历对象键。因此,如果 $scope.users
是一个数组,您将在 usr
变量中获得索引:0, 1, 2, ...
。要遍历数组,您可以使用例如以下构造:
$scope.users.forEach(function(user) {
});
但也许与其使用数组,不如使用由用户名索引的对象会更好。然后,如果给定用户存在 (users[nick] !== undefined
),您将立即获得信息,并且您还将避免一些其他麻烦。参见 Best Practices: Arrays in Firebase。
既然您使用的是 Angular,我建议您使用 Angular 的 forEach
method。这是您可以执行的操作的示例:
angular.forEach($scope.users, function(value, key) {
// put your code here
});
已编辑
这应该适合你。它会在从 Firebase 加载数据后检查您的数据。如果存在用户名,则不会添加名称。如果它不存在,则添加它。您可以查看 AngularFire API for $loaded()
.
var addNameToArray = true;
$scope.users.$loaded().then(function(data) {
angular.forEach(data, function(value, key) {
if(value.username === "John") {
addNameToArray = false;
}
});
if(addNameToArray) {
$scope.users.$add({username: "John"});
}
});
var myApp = angular.module("myApp", ["firebase"]);
var nick = prompt("Anna nimesi");
myApp.controller("MyController", ["$scope", "$firebaseArray",
function($scope, $firebaseArray) {
var msgref = new Firebase("https://(myapp).firebaseio.com/messages");
var usrref = new Firebase("https://(myapp).firebaseio.com/users");
$scope.messages = $firebaseArray(msgref);
$scope.users = $firebaseArray(usrref);
console.log($scope.users);
console.log($scope.messages);
var taken = false;
angular.forEach($scope.users, function(value, key) {
console.log(value, key);
if (value.username == nick) {
taken = true;
}
// put your code here
});
if (taken == false) {
$scope.users.$add({
username: nick
});
};
$scope.addMessage = function(e) {
if (e.keyCode == 13 && $scope.msg) {
var name = nick || "anynomous";
$scope.messages.$add({
from: name,
body: $scope.msg
});
$scope.msg = "";
}
}
}
])
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<link rel="stylesheet" type="text/css" href="style.css">
<meta charset="utf-8" />
<title>title</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<script src="https://cdn.firebase.com/js/client/2.2.4/firebase.js"></script>
<script src="https://cdn.firebase.com/libs/angularfire/1.1.1/angularfire.min.js"></script>
</head>
<body ng-controller="MyController">
<div class="example-chat l-demo-container">
<ul id="example-messages" class="example-chat-messages">
<li ng-repeat="msg in messages">
<strong class="example-chat-username">{{msg.from}}</strong>
{{msg.body}}
</li>
</ul>
</div>
<input class="input" autofocus="true" ng-model="msg" ng-keydown="addMessage($event)" type="text" id="messageInput" placeholder="kirjota">
<script src="script.js"></script>
</body>
</html>
我正在聊天,我想检查是否已经有一个同名的用户,这样就不能有两个用户具有相同的昵称。这不起作用,我可以添加许多相同的刻痕。
var usrref = new Firebase("https://(myapp).firebaseio.com/users");
$scope.users = $firebaseArray(usrref);
var taken = false;
for (var usr in $scope.users) {
if(usr.username == nick){
taken = true;
};};
if(taken == false){
$scope.users.$add({username:nick});
};
我的消息在 html 中使用 ng-repeat 完美显示,但我无法完成这项工作。这显然很简单,但我为此苦苦挣扎了太久。
A for (var ... in ...)
遍历对象键。因此,如果 $scope.users
是一个数组,您将在 usr
变量中获得索引:0, 1, 2, ...
。要遍历数组,您可以使用例如以下构造:
$scope.users.forEach(function(user) {
});
但也许与其使用数组,不如使用由用户名索引的对象会更好。然后,如果给定用户存在 (users[nick] !== undefined
),您将立即获得信息,并且您还将避免一些其他麻烦。参见 Best Practices: Arrays in Firebase。
既然您使用的是 Angular,我建议您使用 Angular 的 forEach
method。这是您可以执行的操作的示例:
angular.forEach($scope.users, function(value, key) {
// put your code here
});
已编辑
这应该适合你。它会在从 Firebase 加载数据后检查您的数据。如果存在用户名,则不会添加名称。如果它不存在,则添加它。您可以查看 AngularFire API for $loaded()
.
var addNameToArray = true;
$scope.users.$loaded().then(function(data) {
angular.forEach(data, function(value, key) {
if(value.username === "John") {
addNameToArray = false;
}
});
if(addNameToArray) {
$scope.users.$add({username: "John"});
}
});