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"});
   }

 });