【问题标题】:AngularFire, access deep child links?AngularFire,访问深层子链接?
【发布时间】:2016-07-13 16:14:03
【问题描述】:

在 Firebase 中使用最新的 Angular,我正在尝试从登录用户那里访问一些较深的嵌套项目。

结构看起来像这样: firebase -> users -> user-uid -> email/name/pass/lists/(lists 有)-> list-uid -> item-uid ->项目名称。

我想访问那个姓氏子项(最好通过 ng-repeat,因为它们是列表项,我希望它们显示在每个用户的仪表板上)。

我一直在尝试不同的方法,但最接近的一种是:

$scope.user = $firebaseObject(ref.child('users').child(authData.uid));

然后在我的 html 中(现在):

<span>{{user.lists}}</span>

打印出类似的内容: {"-uid":{"age":"21", "name":"martin"},{"-uid":{"age":"25", "name ":"john"}}} 等等等等等等。

参考转到:

        var ref = new Firebase('https://url.firebaseio.com');

有什么想法吗?谢谢!

编辑: 我尝试像这样添加一个 ng-repeat:

<li ng-repeat="list in user.lists">{{list.name}}</li>

这有点奏效,它向我展示了我放入的对象是静态的,而不是“更深一层”的对象...

编辑 2: 使用 .json 更新结构。 我可以得到“我”的名字,但不能得到更深层次的“mjölk”:

"users" : {
"8a6da12a-0992-43f5-bb33-95ddd49fed8c" : {
  "email" : "torsten@gmail.com",
  "lists" : {
    "-KDjNYC8GS2QFHYyp74L" : {
      "age" : "other",
      "name" : "me"
    },
    "8a6da12a-0992-43f5-bb33-95ddd49fed8c" : {
      "-KDjN_NkTQmj_1R00xZL" : {
        "done" : false,
        "id" : 1458936351305,
        "name" : "mjölk"
      },
      "-KDjN_r0WmT6xiZwadO5" : {
        "done" : false,
        "id" : 1458936351305,
        "name" : "ägg"
      },
      "-KDjNagkBWmJRj6oQqc2" : {
        "done" : false,
        "id" : 1458936351305,
        "name" : "rejv"
      },
      "-KDjNb5Fpak_9A_rvn8W" : {
        "done" : false,
        "id" : 1458936351305,
        "name" : "kossor"
      },
      "-KDjOVtAFJoYVNUkapNC" : {
        "done" : false,
        "id" : 1458936351305,
        "name" : "piss"
      },
      "-KDjOlemXR2eOoqPBh0v" : {
        "done" : false,
        "id" : 1458936677873,
        "name" : "mjölk igen"
      }
    }
  },

【问题讨论】:

  • 不要描述您的数据结构,而是在您的问题中包含实际 JSON 树的 sn-p(作为文本,而不是屏幕截图)。您可以通过单击 Firebase 数据库中的“导出”按钮轻松获取此信息。
  • 虽然从扫描描述来看,看起来你是在嵌套列表。 Firebase documentation recommends to nest data sparingly 的原因有很多,这就是其中之一。
  • 我已经通读了几遍,但我不确定我应该如何以不同的方式构建结构。我希望登录的用户能够制作自己的列表,只显示他们自己创建的列表(通过他们的 uid)。也许所有“其他” uid 都是多余的,但我似乎无法摆脱它们。我希望只有用户和列表有一个 uid,而不是每个项目。我马上用 .json 更新主帖!
  • @FrankvanPuffelen 用 .json 更新了主帖

标签: angularjs firebase angularfire firebase-realtime-database


【解决方案1】:

正如我在评论中已经说过的:部分问题是由嵌套列表引起的。 Firebase documentation recommends to nest data sparingly 的原因有很多,这就是其中之一。

要取消嵌套数据,请将用户配置文件与每个用户的列表分开存储:

"users" : {
  "8a6da12a-0992-43f5-bb33-95ddd49fed8c" : {
    "email" : "torsten@gmail.com",
  }
},
"user_lists" : {
  "-KDjNYC8GS2QFHYyp74L" : {
    "age" : "other",
    "name" : "me"
  },
  "8a6da12a-0992-43f5-bb33-95ddd49fed8c" : {
    "-KDjN_NkTQmj_1R00xZL" : {
      "done" : false,
      "id" : 1458936351305,
      "name" : "mjölk"
    },
    "-KDjN_r0WmT6xiZwadO5" : {
      "done" : false,
      "id" : 1458936351305,
      "name" : "ägg"
    },
    "-KDjNagkBWmJRj6oQqc2" : {
      "done" : false,
      "id" : 1458936351305,
      "name" : "rejv"
    },
    "-KDjNb5Fpak_9A_rvn8W" : {
      "done" : false,
      "id" : 1458936351305,
      "name" : "kossor"
    }
  }
}

现在,如果您想显示个人资料列表和当前用户的列表,您:

var ref = new Firebase('https://yours.firebaseio.com');
$scope.users = $firebaseArray(ref.child('users'));
$scope.lists = $firebaseArray(ref.child('user_lists').child(auth.uid));

然后在你的 HTML 中:

<p>Users:</p>
<ul>
  <li ng-repeat="user in users">{{user.email}}</li>
</ul>

<p>Lists for you:</p>
<ul>
  <li ng-repeat="list in lists">{{list.name}}</li>
</ul>

【讨论】:

  • 谢谢!拯救了我的夜晚! :)
  • 很高兴听到这个消息。现在去破解吧!如果“取消嵌套”尚不清楚,请告诉我,因为正确地构建应用程序至关重要。
猜你喜欢
  • 2018-01-28
  • 2015-09-28
  • 1970-01-01
  • 2018-09-19
  • 2010-11-10
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多