如何在Firebase和Angular中获取特定元素和优先顺序

时间:2015-11-30 06:50:20

标签: angularjs firebase angularfire

我有这样的firebase引用:

$scope.lessons = $firebaseArray(firebase.child('Lessons').orderByChild('courseID').equalTo($state.params.courseID));

我正在输出这样的课程:

<ul>
        <li class="lesson" ng-if="lesson.moduleID == module.$id" ng-repeat="lesson in lessons" lessonid="{{lesson.$id}}">
            <lessonedit></lessonedit>
        </li>
</ul>

我需要按优先级排序课程,但是当我将orderByPriority()函数添加到firebase引用的末尾时,它表示我只能使用一个orderBy调用。

我尝试了过滤器lesson in lessons | orderByPriority,但它说过滤器不存在?

3 个答案:

答案 0 :(得分:2)

目前,您不能将.orderByPriority().orderByChild()混合在一起,因为它们是不同的功能顺序。

但是,如果重新构建数据,只能使用.orderByPriority()来解决问题。

Structuring your data a specific way allows you query your data, as if you could use two orderBy functions

在您的情况下,您有一个“课程”的位置,所有人都有“课程ID”的推送ID键:/lessons/$lessonID

您可以将结构更改为关键courseId然后 lesson_id/lessions/$courseID/$lessonID

数据如下所示:

{
  "lessons": {
    "1": {
      "-K4NQTsjo3iswX4PhKUw": {
        title: "My Course"
      },
      "-K4NAWsjo5iswX4Jk4fa": {
        title: "Another Course"
      }
    }
    "2": {
      "-K4NQTsjo3iswX4PhKUw": {
        title: "My Course"
      },
      "-K4NQPjMZVCoFRYc_1v5": {
        title: "Intro to Data Structure"
      }
    }
  }
}

现在,由于密钥使用courseID,我们可以按courseID和优先级排序:

var courseID = $state.params.courseID;
var ref = new Firebase('<my-firebase-app>.firebaseio.com/lessons');
var query = ref.child(courseID).orderByPriority();
var syncArray = $firebaseArray(query);

您可以将它存储在AngularJS代码的工厂中。

angular.module('app', ['firebase')
  .constant('FirebaseUrl', '<my-firebase-app>')
  .service('RootRef', ['FirebaseUrl', Firebase])
  .factory('Lessons', Lessons)
  .controller('MainCtrl', MainCtrl);

function Lessons(RootRef) {
  return function Lessons(courseID) {
    var ref = RootRef.child('Lessons');
    var query = ref.child(courseID).orderByPriority();
    return $firebaseArray(query);
  }
}

function MainCtrl($scope, $state, Lessons) {
  var courseID = $state.params.courseID;
  $scope.lessons = Lessons(courseID);
}

答案 1 :(得分:1)

如果Priority是课程的属性,您可以像这样使用角度过滤器orderBy

<ul>
    <li class="lesson" 
        ng-if="lesson.moduleID == module.$id" 
        ng-repeat="lesson in lessons | orderBy:'Priority'" 
        lessonid="{{lesson.$id}}">
        <lessonedit></lessonedit>
    </li>
</ul>

答案 2 :(得分:0)

使用Firebase的新查询API,您可以执行以下操作:

var ref = new Firebase(&#39; https://your.firebaseio.com/&#39;);

ref
  .orderBy('genre')
  .startAt('comedy').endAt('comedy')
  .orderBy('lead')
  .startAt('Jack Nicholson').endAt('Jack Nicholson')
  .on('value', function(snapshot) { 
  console.log(snapshot.val()); 
  });

请注意,新的查询API仍处于测试阶段,因此在正式发布之前可能会发生变化。

请参阅此jsbin for a similar query on Firebase's sample data set

您可以查看Frank van Puffelen的原始帖子here