如何在 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);
}
我有一个这样的 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);
}