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});
};
Мои сообщения отлично отображаются с ng-repeat в html, но я не могу получить эту работу. Очевидно, что-то простое, но я слишком долго боролся с этим.
Поскольку вы используете Angular, я бы предложил использовать метод Angular forEach
. Вот пример того, что вы могли бы сделать:
angular.forEach($scope.users, function(value, key) {
// put your code here
});
отредактированный
Это должно сработать для вас. Он проверяет ваши данные после их загрузки из Firebase. Если имя пользователя присутствует, оно не добавляет имя. Если его нет, то он добавляется. Вы можете проверить API AngularFire для $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"});
}
});
A for (var... in...)
выполняет итерацию по клавишам объектов. Поэтому, если $scope.users
- это массив, вы получите индексы: 0, 1, 2,...
в переменной usr
. Чтобы перебрать массив, вы можете использовать, например, следующую конструкцию:
$scope.users.forEach(function(user) {
});
Но, возможно, вместо использования массива было бы лучше использовать объект, проиндексированный по имени пользователя. Затем вы получите немедленную информацию, если данный пользователь существует (users[nick] !== undefined
), и вы также избегаете других неприятностей. См. Рекомендации: массивы в Firebase.