我想我越来越近了,我可以打印属于用户的图书的ID,但是一直在尝试不成功地从Firebase图书参考中获取属于用户的图书列表.

我在这里松散地讲述了这个教程:
http://www.thinkster.io/pick/eHPCs7s87O/angularjs-tutorial-learn-to-rapidly-build-real-time-web-apps-with-firebase#item-526e9330d90f99661f00046c

并在这里阅读有关反规范化数据的文档:
https://www.firebase.com/blog/2013-04-12-denormalizing-is-normal.html

如果我想在一个页面中显示用户,然后是其所有的书籍,我该怎么办?

firebase结构

FB
|
--user
| |
| --user1
|   |
|   --name: "test name"
|   --email: "test@test.com"
|   --books
|     |
|     "-JFZG3coHOAblHZ7XSjK": true
|     "-KJKJASDIUOPIWE9WEeJ": true
|     "-YtUTRGJLNL876F3SSwS": true
|
--books
  |
  --"-JFZG3coHOAblHZ7XSjK"
  | |
  | --title: "book title 1"
  | --ownerId: "user1"
  |
  --"-KJKJASDIUOPIWE9WEeJ"
  |  |
  |  --title: "book title 2"
  |  --ownerId: "user1" 
  |    
  --"-YtUTRGJLNL876F3SSwS"
  |  |
  |  --title: "book title 2"
  |  --ownerId: "user1"

视图

<div data-ng-controller="UsersController" data-ng-init="findOneUser()">
  <h2>Profile</h2>
  <img class="image_preview" data-ng-src="{{user.photoUrl}}">
  <p>Name: {{ user.name }}</p>
  <p>Name: {{ user.email }}</p>
  <a data-ng-href="#/users/{{ userId }}/edit">Edit</a>

  <h2>Coffee Blends</h2>

  <div data-ng-repeat="book in user.books">
    <p>---</p>
    <p>{{user.books}}</p>
  </div>
  <!--<div data-ng-controller="BooksController" data-init="">-->

  <!--</div>-->
</div>

调节器

'use strict';

angular.module('ccApp.controllers.users',['ccApp.services.users'])
    .controller('UsersController',['$scope','$routeParams','$location','angularFire','Users',function($scope,$routeParams,$location,angularFire,Users){

      $scope.user = {};
      $scope.userId = $routeParams.userId;

      $scope.findOneUser = function(userId){
        if (!!$scope.userId){
          angularFire(Users.find($routeParams.userId),$scope,'user');
        }
      };

      $scope.updatePhotoUrl = function(url,user){
        $scope.fileUrl = url;
        console.log($scope.fileUrl[0].url);
        user.photoUrl = $scope.fileUrl[0].url;
      };

      $scope.findUsers = function(){
        $scope.users = Users.collection();
      };

      $scope.findWholesalers = function(){
        $scope.wholesalers = Users.collection();
      };

    }]);

服务

'use strict';

angular.module('ccApp.services.users',['ccApp.services.firebaseRefs'])
  .factory('Users',['angularFireCollection','FireRef',function(angularFireCollection,FireRef){
      return{
        collection: function(cb){
          return angularFireCollection(FireRef.users(),cb);
        },find: function(userId){
          return FireRef.users().child('/'+userId);
        }
      };
  }]);
从更新到angularFire 0.6开始.这看起来是0.3.* ish. angularFire已更改为$firebase,并具有更强大和简化的界面.

香草火腿

我会这样做的艰难的方法,因为我认为这里有很大的价值理解这里的基本原则.这是相当复杂的,我只会涵盖必需品.还有很多小边缘的案件也被处理:

angular.module('app',[])
    .controller('UsersController',$firebase,$timeout,$routeParams){
      var userId = $routeParams.userId;
      $scope.user = $firebase(new Firebase('URL/user/'+userId));

      // or,for 3-way binding and automatic writes back to Firebase
      var userRef = $firebase(new Firebase('URL/users/'+userId)).$bind($scope. 'user');

      // grab this users' books using Firebase (the hard way)
      $scope.books = {};
      var booksRef = new Firebase('URL/books/');

      // fetch the user's book list dynamically because it may change in real-time
      var indexRef = new Firebase('URL/user/'+userId+'/books');

      // watch the index for add events
      indexRef.on('child_added',function(indexSnap) {
         // fetch the book and put it into our list
         var bookId = indexSnap.name();
         booksRef.child(bookId).on('value',function(bookSnap) {
            // trigger $digest/$apply so Angular syncs the DOM
            $timeout(function() {
               if( snap.val() === null ) {
                  // the book was deleted
                  delete $scope.books[bookId];
               }
               else {
                  $scope.books[bookId] = snap.val();
               }
            });
         });
      });

      // watch the index for remove events
      indexRef.on('child_removed',function(snap) {
         // trigger $digest/$apply so Angular updates the DOM
         $timeout(function(snap) {
            delete $scope.books[snap.name()];
         });
      });
});

然后HTML(下面的其他例子将是一样的):

<div data-ng-repeat="(bookId,book) in books">
   {{bookId}}: {{book.title}}
</div>

这里的一些边缘案例没有完全涵盖:

>数据不按优先级排序排序
>当从索引中删除记录时,应该在数据路径上调用off()
>索引排序的变化不会改变数据记录的顺序
>索引的值不存储在任何地方以供参考(如果重要)

FirebaseIndex

FirebaseIndex是一个简单的实用程序,它采用像您的书籍列表这样的索引,并以更复杂的方式管理我们刚才创建的代码.

不幸的是,FirebaseIndex不支持值事件,所以它不能与0.5之后的angularFire一起使用,因为对angularFire的内部加载机制有所改变.所以它不像以前那么简短和甜蜜.

angular.module('app',[])
.controller('UsersController',$timeout){
   var userId = $routeParams.userId;
   $scope.user = $firebase(new Firebase('URL/user/'+userId));

   var fb = new Firebase(URL);
   var index = new FirebaseIndex( fb.child('user/'+userId+'/books') );
   $scope.books = {};

   // almost magic
   index.on('child_added',function(snap) {
      $timeout(function() { $scope.books[snap.name()] = snap.val(); });
   });

   index.on('child_removed',function(snap) {
      $timeout(function() { delete $scope.books[snap.name()]; });
   });
});

Firebase.util.join

Firebase-util是一个功能更强大和更复杂的库,用于规范化路径.因为它返回一个像普通Firebase参考一样工作的对象,它也可以与angularFire 0.5及以上版本无缝地使用.

angular.module('app',$firebase){
   var userId = $routeParams.userId;
   $scope.user = $firebase(new Firebase('URL/user/'+userId)); 

   var fb = new Firebase(URL);
   var ref = new Firebase.util.intersection( fb.child('user/'+userId+'/books'),fb.child('books') );

   // magic!
   $scope.books = $firebase(ref);
});

angularjs – Firebase数据归一化.我应该如何根据这个结构获取一个集合?的更多相关文章

  1. 如何使用Firebase在iOS上验证用户的电子邮件地址?

    我坚持使用firebase进行电子邮件验证.我四处寻找指导但没有帮助.在用户验证他的电子邮件后,我的代码仍然打印出用户尚未验证.我还在尝试习惯firebase的语法.这是我的代码:这是我注册部分的代码:解决方法您在签名之前检查了用户电子邮件是否已经过验证.这对我有用.

  2. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  3. ios – Swift Firebase安全无法正常工作

    正如@M_G建议的那样,我从父母和.read中取出了.write.所以我的规则现在是:我现在得到这个输出:解决方法Firebase文档错误(暂时).在Firebase控制台中,打开规则模拟器.目前没有“密码”选项,我认为这是一个错误.如果您没有使用多个身份验证或多个身份验证在您的项目中无关紧要,请不要在您的规则中使用提供程序.否则,您可以测试此规则以进行密码验证:

  4. ios – Firebase:我应该将GoogleService-Info.plist添加到.gitignore吗?

    我正在将Firebase用于我想要开源的iOS项目.我上传之前是否应该将GoogleService-Info.plist添加到.gitignore我在Github上共享项目?我知道它包含我的API密钥,客户端ID等,这可能不安全公开?

  5. ios – Firebase动态链接中的customURLScheme是什么?

    在documentation中它说要将以下行添加到我的AppDelegate.swift:根据我的理解,这应该是您在info.plist中添加的相同链接.但是,我很困惑为什么在quickstart-iosrepo他们决定将其等同于“dlscheme”.任何人都可以帮我理解这个方案究竟是什么?

  6. FIrebase iOS集成崩溃 – 由无效的GOOGLE_APP_ID引起

    我正在尝试使用Xcode构建集成Firebase来构建我的Cordova应用程序,但是我得到了这个模糊的错误,我无法理解什么是错的.我已将GoogleService-Info.plist文件放在项目目录中,但仍无法构建.这是堆栈跟踪可能是什么问题,我不知道还有什么需要展示,所以请问.解决方法出于某种原因,Xcode始终忽略位于项目根目录中的GoogleService-Info.plist,并且未将其复制到项目的Resources文件夹中.我在那里手动复制文件,然后编译应用程序并运行得很好.

  7. 使用Firebase iOS Swift将特定设备的通知推送到特定设备

    我非常感谢PushNotifications的帮助.我的应用聊天,用户可以直接向对方发送短信.但是如果没有PushNotifications,它就没有多大意义.它全部设置在Firebase上.如何将推送通知从特定设备发送到特定设备?

  8. ios – Firebase Swift – 如何创建子项并将其id添加到另一个ref属性?

    如here所述,我想将Book对象存储在单独的ref中,并将其id值存储在User的books属性中每当我在应用程序中添加一本书时book对象是在Booksref中创建的,但我想立即将其id添加到User的用户书籍数组中.可以用一些漂亮的方式完成,而不是查询书籍,检索它的ID并将其添加到数组中吗?如果不是,查询刚刚创建的对象id的正确方法是什么?也许我不应该使用AutoId模式并在应用程序中为自己创建每个对象的唯一ID?解决方法您可以通过以下方式获取childByAutoId创建的密钥:

  9. ios – 默认应用尚未配置

    我试图将我的应用程序升级到新版本的Firebase.我浏览了设置指南,并编辑了我的所有代码以匹配新的语法.但是,当我运行应用程序时,我会收到这两个错误.我在AppDelegate中有FIRApp.configure(),并将GoogleServices-Info.plist导入到我的项目中.plist也有所有正确的信息.任何人遇到这个或知道如何解决它?

  10. ios – Firebase – 删除和重新安装应用程序不会取消对用户进行身份验证

    在使用以下代码验证用户之后….如果您随后删除该应用程序并将其重新安装在同一台设备上,则该调用将始终返回他们登录.这是为什么?

随机推荐

  1. Angular2 innerHtml删除样式

    我正在使用innerHtml并在我的cms中设置html,响应似乎没问题,如果我这样打印:{{poi.content}}它给了我正确的内容:``但是当我使用[innerHtml]=“poi.content”时,它会给我这个html:当我使用[innerHtml]时,有谁知道为什么它会剥离我的样式Angular2清理动态添加的HTML,样式,……

  2. 为Angular根组件/模块指定@Input()参数

    我有3个根组件,由根AppModule引导.你如何为其中一个组件指定@input()参数?也不由AppModalComponent获取:它是未定义的.据我所知,你不能将@input()传递给bootstraped组件.但您可以使用其他方法来做到这一点–将值作为属性传递.index.html:app.component.ts:

  3. angular-ui-bootstrap – 如何为angular ui-bootstrap tabs指令指定href参数

    我正在使用角度ui-bootstrap库,但我不知道如何为每个选项卡指定自定义href.在角度ui-bootstrap文档中,指定了一个可选参数select(),但我不知道如何使用它来自定义每个选项卡的链接另一种重新定义问题的方法是如何使用带有角度ui-bootstrap选项卡的路由我希望现在还不算太晚,但我今天遇到了同样的问题.你可以通过以下方式实现:1)在控制器中定义选项卡href:2)声明一个函数来改变控制器中的散列:3)使用以下标记:我不确定这是否是最好的方法,我很乐意听取别人的意见.

  4. 离子框架 – 标签内部的ng-click不起作用

    >为什么标签标签内的按钮不起作用?>但是标签外的按钮(登陆)工作正常,为什么?>请帮我解决这个问题.我需要在点击时做出回复按钮workingdemo解决方案就是不要为物品使用标签.而只是使用divHTML

  5. Angular 2:将值传递给路由数据解析

    我正在尝试编写一个DataResolver服务,允许Angular2路由器在初始化组件之前预加载数据.解析器需要调用不同的API端点来获取适合于正在加载的路由的数据.我正在构建一个通用解析器,而不是为我的许多组件中的每个组件设置一个解析器.因此,我想在路由定义中传递指向正确端点的自定义输入.例如,考虑以下路线:app.routes.ts在第一个实例中,解析器需要调用/path/to/resourc

  6. angularjs – 解释ngModel管道,解析器,格式化程序,viewChangeListeners和$watchers的顺序

    换句话说:如果在模型更新之前触发了“ng-change”,我可以理解,但是我很难理解在更新模型之后以及在完成填充更改之前触发函数绑定属性.如果您读到这里:祝贺并感谢您的耐心等待!

  7. 角度5模板形式检测形式有效性状态的变化

    为了拥有一个可以监听其包含的表单的有效性状态的变化的组件并执行某些组件的方法,是reactiveforms的方法吗?

  8. Angular 2 CSV文件下载

    我在springboot应用程序中有我的后端,从那里我返回一个.csv文件WheniamhittingtheURLinbrowsercsvfileisgettingdownloaded.现在我试图从我的角度2应用程序中点击此URL,代码是这样的:零件:服务:我正在下载文件,但它像ActuallyitshouldbeBook.csv请指导我缺少的东西.有一种解决方法,但您需要创建一个页面上的元

  9. angularjs – Angular UI-Grid:过滤后如何获取总项数

    提前致谢:)你应该避免使用jQuery并与API进行交互.首先需要在网格创建事件中保存对API的引用.您应该已经知道总行数.您可以使用以下命令获取可见/已过滤行数:要么您可以使用以下命令获取所选行的数量:

  10. angularjs – 迁移gulp进程以包含typescript

    或者我应该使用tsc作为我的主要构建工具,让它解决依赖关系,创建映射文件并制作捆绑包?

返回
顶部