如何在 Firebase 和 Angular 中获取特定元素和 orderby 优先级

How to get specific element and orderby priority in Firebase and Angular

我有一个这样的 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 但它说过滤器不存在?

如果 Priority 是课程的属性,您可以像这样使用 angular 过滤器 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>

使用 Firebase 的新查询 API,您可以通过以下方式执行此操作:

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

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

的原文 Post

目前,您不能混合使用 .orderByPriority().orderByChild(),因为它们的功能顺序不同。

但是,如果您重新构建数据,您仍然可以仅使用 .orderByPriority() 来解决您的问题。

.

在你的例子中,你有一个 "Lessons" 的位置,它们都有一个 "lesson 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);
}