【问题标题】:How to create show controller in AngularFire with new API如何使用新 API 在 AngularFire 中创建显示控制器
【发布时间】:2015-04-15 13:28:41
【问题描述】:

我是 angular 和 firebase 的新手,自从几天前切换 API 以来一直遇到问题。我有一个课程索引控制器和一个课程显示控制器,索引有效,但节目无效。这是索引:

myApp.controller('CoursesIndexController', 
    function($scope, $firebaseObject, FIREBASE_URL) {
        var ref = new Firebase(FIREBASE_URL+'/courses/');
        $scope.courses = $firebaseObject(ref);
    }
    );

我的课程显示控制器给了我更多的问题。我不确定如何提取特定条目。

myApp.controller('CoursesShowController', 
    function($scope, $firebaseObject, $firebaseArray, $routeParams, FIREBASE_URL) {
        var ref = new Firebase(FIREBASE_URL+'/courses/');
        var courses = $firebaseArray(ref);
        var key = $routeParams.id.toString();
        console.log(courses.get({shortName: key}));
    }
 );

我正在尝试返回 1 门课程,其中 shortName 与地址栏中的键匹配。 $routeParams.id.toString() 返回该键的文本字符串就好了,但我得到一个尝试拉课程时出现“未定义不是函数”错误。值得一提的是,每门课程的关键是一个时间戳,所以我要拉的“关键”就在对象本身中。

我用这个 html sn-p 循环浏览课程:

  <div class="course" class="col-sm-6" ng-repeat="course in courses" >
    <p><a ng-href="#/courses/{{course.shortName}}">{{course.name}}</a></p>
  </div><!-- courses list -->

非常感谢您的帮助!

编辑:这是我的课程 firebaseArray 在我 console.log 时的样子:

EDITx2:我可以通过以下命令直接返回单个对象,但我仍然不知道如何通过对象中的 shortName 检索它:

console.log($firebaseObject($scope.courses.$ref().child('-JWT5y43YFy1mGirVVS2')));

【问题讨论】:

  • $firebaseObject 正在从服务器获取数据。在尝试读取它们之前,您必须等待值返回。一般来说,把它放在作用域中并在视图中使用它,停止尝试 console.log 异步值。
  • 最好的做法是拉出 firebaseArray,然后通过它搜索与我的 routeParams 匹配的 shortName 或正确拉出正确的 firebaseObject?执行其中任何一项的代码是什么?谢谢,这很有帮助!
  • The guide 详细介绍了所有这些主题,包括入门部分中有关异步操作的部分。我会在那里挖。一般来说,如果您已经知道记录 ID,只需使用 $firebaseObject 获取它。

标签: javascript angularjs firebase


【解决方案1】:

您是否尝试过$getRecord() 而不是get()?在 AngularFire 文档 here 中注明。您的代码在下面为$getRecord() 稍作修改:

myApp.controller('CoursesShowController', 
    function($scope, $firebaseObject, $firebaseArray, $routeParams, FIREBASE_URL) {
        var ref = new Firebase(FIREBASE_URL+'/courses/');
        var courses = $firebaseArray(ref);
        var key = $routeParams.id.toString();
        console.log(courses.$getRecord({shortName: key}));
    }
 );

【讨论】:

  • 感谢您的回复,但是当我使用您指定的获取记录功能时,我得到一个空值。如果这样更容易,我在上面添加了一张带有我的课程数组的照片。
  • 我在帖子中的上图中显示的内容。首先有几个对象,每个对象都是一个课程,然后有很多方法。
  • 嗯。我想知道 $getRecord() 是否需要 $id。如果你运行console.log(courses.$getRecord("-JWT5y43YFy1mGirVVS2"));,我想知道你会得到什么。
  • 我又变成空了!这太疯狂了,我肯定会认为最后一个选项应该有效。
  • 当你console.log(courses) 时你能检查一下$getRecord 是否是出现的方法之一吗?根据您上面的屏幕截图,我看到$add$save$remove$keyAt 可用。说起来,console.log(courses.$keyAt(0)); 返回什么?
【解决方案2】:

尝试枚举数组,寻找正确的对象:

myApp.controller('CoursesShowController', 
    function($scope, $firebaseObject, $firebaseArray, $routeParams, FIREBASE_URL) {
        var ref = new Firebase(FIREBASE_URL+'/courses/');
        var courses = $firebaseArray(ref);
        var key = $routeParams.id.toString();
        var course;
        for (var i = 0; i < courses.length; i++) {
            if (courses[i].shortName === key) { 
                course = courses[i];
                break;
            }
        }
        console.log(course);
    }
 );

【讨论】:

  • 当我输入:console.log(courses[0]);返回一个 null 所以迭代长度也对我没有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2017-07-28
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
相关资源
最近更新 更多