Foreach с огненной базой

0

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, но я не могу получить эту работу. Очевидно, что-то простое, но я слишком долго боролся с этим.

Теги:
firebase
for-loop
foreach
angularfire

2 ответа

1
Лучший ответ

Поскольку вы используете 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"});
   }

 });
  • 0
    Используя это, и перейдите в службу, чтобы проверить, чтобы вернуть статус, после загрузки, работает хорошо.
  • 0
    Я думаю, что я не использую эти примеры правильно. Я пробовал много способов, как решить эту проблему, но я не могу заставить ее работать .. Я поставил console.log ("somthing"); внутри, где я должен положить код, но он даже не отображается в консоли. Sry, если плохой английский.
Показать ещё 4 комментария
0

A for (var... in...) выполняет итерацию по клавишам объектов. Поэтому, если $scope.users - это массив, вы получите индексы: 0, 1, 2,... в переменной usr. Чтобы перебрать массив, вы можете использовать, например, следующую конструкцию:

$scope.users.forEach(function(user) {

});

Но, возможно, вместо использования массива было бы лучше использовать объект, проиндексированный по имени пользователя. Затем вы получите немедленную информацию, если данный пользователь существует (users[nick] !== undefined), и вы также избегаете других неприятностей. См. Рекомендации: массивы в Firebase.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню