Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在post中加载评论_Javascript_Angularjs_Firebase_Angularfire - Fatal编程技术网

Javascript 在post中加载评论

Javascript 在post中加载评论,javascript,angularjs,firebase,angularfire,Javascript,Angularjs,Firebase,Angularfire,假设我在Firebase数据库中有这个结构 编辑: 我的JSON结构如下所示: { ad-comments:{ 48a047b7-28a2-4037-925c-2a809b8d4445:{ -K4iGKXbniQZUi4r1SW7:{ Comment:"" Email:"" Date:"" Submitter:"" ID:"" } -K4hxcKuuxcwu

假设我在Firebase数据库中有这个结构

编辑: 我的JSON结构如下所示:

{
  ad-comments:{
    48a047b7-28a2-4037-925c-2a809b8d4445:{
      -K4iGKXbniQZUi4r1SW7:{
         Comment:""
         Email:""
         Date:""
         Submitter:""
         ID:""
      }
      -K4hxcKuuxcwuhScPR_v:{...}    
    }
    eeb082e5-59ed-4c3b-8fcd-5af24a2bcada:{...}    
  }
  users:{
    48a047b7-28a2-4037-925c-2a809b8d4445:{
      text:""
      name:""
      email:""
      desc:""
      phone:""
    }
    444198db-1052-4d8d-a1cd-c7e613fbe7c9:{...}  
  }
}
在控制器中,Im检索用户(每个用户都有一个属性帖子)以使用$firebaseArray和ng在视图上显示他们,重复如下操作:

var ref = new Firebase ("https://url.firebaseio.com/users");
$scope.posts = $firebaseArray("ref");
现在在视图中,我只需使用ng repeat来迭代它们

<div ng-repeat="post in posts">

  <div>{{post.name}}</div>
  <div>{{post.text}}</div>

  <div>Comments:<div>
     <div><input type="text" ng-model="comment"></div>
     <div><button ng-click="addComment(post, comment)">Add</button></div>
</div>

{{post.name}
{{post.text}
评论:
添加
所以现在的问题是,当每个帖子位于不同的节点时,我如何进行查询以请求每个帖子的所有评论,我按ID存储它们,但仍然不知道如何做


在我将评论存储在每个用户的内部并且可以在每个帖子上显示评论之前,我遇到了安全规则方面的问题,因为我已经指定用户只能修改自己的内容而不能修改其他内容,并且将评论保留在用户内部不允许其他人发表评论,因此,我不得不更改并将注释放在不同的节点上。

您保持了数据平面,这太棒了

您还使用了两个位置之间的共享密钥,这意味着您已经完成了90%的任务

处理这种情况有多种方法,但提供了一个优雅的解决方案

下面的代码示例使用了,因此,如果您对代码不熟悉,请不要担心

,下面是创建它的步骤

我们希望为每个用户加载评论。我们将首先创建一个工厂,通过
uid
获取
ad注释:

function UserCommentsArray($firebaseArray, rootRef) {
  return function UserCommentsArray(uid) {
    var userCommentsRef = rootRef.child('ad-comments').child(uid);
    return $firebaseArray(userCommentsRef);
  };
}
现在,我们将使用
$firebaseArray.$extend()
创建自定义同步阵列

function UsersArray($firebaseArray, rootRef, userCommentsArray) {
    return $firebaseArray.$extend({
      $$added: function(snap) {
        var user = snap.val();
        user.$id = snap.key();
        user.comments = userCommentsArray(snap.key());
        return user;
    }
  });
}
每次向数组中添加一个项时,我们都将创建一个用户对象,并添加来自
userCommentsArray
的注释

现在,在控制器代码中,我们可以简单地插入
usersArray
并绑定到页面

function MyCtrl($scope, rootRef, usersArray) {
  var usersRef = rootRef.child('users');
  $scope.users = usersArray(usersRef);
}
在页面上显示此数据需要更改模板:

  <div ng-controller="MyCtrl">

    <div ng-repeat="user in users">

      <div>{{user.name}}</div>

      <ul ng-repeat="comment in user.comments">
        <li>{{ comment.text }}</li>
      </ul>

      <div>Comments:</div>
      <div>
        <input type="text" ng-model="newComment">
      </div>

      <div>
        <button 
          ng-click="addComment(user, newComment)">Add
        </button>
      </div>

    </div>
  </div>

您将数据保持平坦,这太棒了

您还使用了两个位置之间的共享密钥,这意味着您已经完成了90%的任务

处理这种情况有多种方法,但提供了一个优雅的解决方案

下面的代码示例使用了,因此,如果您对代码不熟悉,请不要担心

,下面是创建它的步骤

我们希望为每个用户加载评论。我们将首先创建一个工厂,通过
uid
获取
ad注释:

function UserCommentsArray($firebaseArray, rootRef) {
  return function UserCommentsArray(uid) {
    var userCommentsRef = rootRef.child('ad-comments').child(uid);
    return $firebaseArray(userCommentsRef);
  };
}
现在,我们将使用
$firebaseArray.$extend()
创建自定义同步阵列

function UsersArray($firebaseArray, rootRef, userCommentsArray) {
    return $firebaseArray.$extend({
      $$added: function(snap) {
        var user = snap.val();
        user.$id = snap.key();
        user.comments = userCommentsArray(snap.key());
        return user;
    }
  });
}
每次向数组中添加一个项时,我们都将创建一个用户对象,并添加来自
userCommentsArray
的注释

现在,在控制器代码中,我们可以简单地插入
usersArray
并绑定到页面

function MyCtrl($scope, rootRef, usersArray) {
  var usersRef = rootRef.child('users');
  $scope.users = usersArray(usersRef);
}
在页面上显示此数据需要更改模板:

  <div ng-controller="MyCtrl">

    <div ng-repeat="user in users">

      <div>{{user.name}}</div>

      <ul ng-repeat="comment in user.comments">
        <li>{{ comment.text }}</li>
      </ul>

      <div>Comments:</div>
      <div>
        <input type="text" ng-model="newComment">
      </div>

      <div>
        <button 
          ng-click="addComment(user, newComment)">Add
        </button>
      </div>

    </div>
  </div>

我不是Firebase专家,但我认为你应该考虑如何建立帖子和评论之间的联系模型。 我可以想出两种方法:

  • Post实体将有一个附加字段:

    列出注释ID

  • 注释实体将保留帖子的Id

  • 我推荐第一种方法,因为通常我们希望所有者实体(在本例中为Post实体)保留其子实体(注释)


    现在,当您检索帖子时,请确保使用评论ID检索其所有评论。

    我不是Firebase专家,但我认为您应该考虑如何对帖子及其评论之间的连接进行建模。 我可以想出两种方法:

  • Post实体将有一个附加字段:

    列出注释ID

  • 注释实体将保留帖子的Id

  • 我推荐第一种方法,因为通常我们希望所有者实体(在本例中为Post实体)保留其子实体(注释)


    现在,当您检索一篇文章时,请确保使用注释ID检索其所有注释。

    您能在代码中提供JSON数据结构吗?每个位置下只需几个样本就可以了。看起来你真的很接近:)@DavidEast对不起,我不认为我了解你需要什么,你能再解释一下吗?谢谢:)您上传了数据的图像,但它只提供了密钥。如果我看到了实际的JSON转储(只是一个示例,而不是全部),回答起来会很简单。啊,好的,明白了,我编辑了我的问题hope is what you need@davideast
    post
    的值是多少?
    广告评论
    帖子
    之间有什么区别?帖子是
    用户
    和'ad-comments1'之间的数据连接吗?您能在代码中提供JSON数据结构吗?每个位置下只需几个样本就可以了。看起来你真的很接近:)@DavidEast对不起,我不认为我了解你需要什么,你能再解释一下吗?谢谢:)您上传了数据的图像,但它只提供了密钥。如果我看到了实际的JSON转储(只是一个示例,而不是全部),回答起来会很简单。啊,好的,明白了,我编辑了我的问题hope is what you need@davideast
    post
    的值是多少?
    广告评论
    帖子
    之间有什么区别?帖子是
    用户
    和'ad-comments1'之间的数据连接吗?Firebase数据库是一个NoSQL JSON数据存储。没有本机联接或关系。有一种比加入Firebase更简单的技术。我想我知道问题是什么,但我需要查看数据的结构。Firebase数据库是一个NoSQL JSON数据存储。没有本机联接或关系。有一种比加入Firebase更简单的技术。我想我知道问题是什么,但我需要看看数据的结构。非常感谢,它工作了,最后我可以看到它工作了…是的!!!我欠你一些啤酒;)最后一个问题…怎么办