Angularjs 如何在Firebase和Angular中获取特定元素和orderby优先级
我有这样一个firebase参考:Angularjs 如何在Firebase和Angular中获取特定元素和orderby优先级,angularjs,firebase,angularfire,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" lesso
$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>
<ul>
<li class="lesson"
ng-if="lesson.moduleID == module.$id"
ng-repeat="lesson in lessons | orderBy:'Priority'"
lessonid="{{lesson.$id}}">
<lessonedit></lessonedit>
</li>
</ul>
{
"lessons": {
"1": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NAWsjo5iswX4Jk4fa": {
title: "Another Course"
}
}
"2": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NQPjMZVCoFRYc_1v5": {
title: "Intro to Data Structure"
}
}
}
}
我输出的课程如下:
$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>
<ul>
<li class="lesson"
ng-if="lesson.moduleID == module.$id"
ng-repeat="lesson in lessons | orderBy:'Priority'"
lessonid="{{lesson.$id}}">
<lessonedit></lessonedit>
</li>
</ul>
{
"lessons": {
"1": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NAWsjo5iswX4Jk4fa": {
title: "Another Course"
}
}
"2": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NQPjMZVCoFRYc_1v5": {
title: "Intro to Data Structure"
}
}
}
}
-
我需要按优先级对课程进行排序,但当我将orderByPriority()函数添加到firebase引用的末尾时,它表示我只能使用一个orderBy调用
我在lessons | orderByPriority中尝试了过滤器
课程,但它说过滤器不存在?如果优先级
是课程的一个属性,您可以像这样使用角度过滤器:
$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>
<ul>
<li class="lesson"
ng-if="lesson.moduleID == module.$id"
ng-repeat="lesson in lessons | orderBy:'Priority'"
lessonid="{{lesson.$id}}">
<lessonedit></lessonedit>
</li>
</ul>
{
"lessons": {
"1": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NAWsjo5iswX4Jk4fa": {
title: "Another Course"
}
}
"2": {
"-K4NQTsjo3iswX4PhKUw": {
title: "My Course"
},
"-K4NQPjMZVCoFRYc_1v5": {
title: "Intro to Data Structure"
}
}
}
}
-
使用Firebase新的查询API,您可以通过以下方式完成此操作:
var ref=新火基(“”)
请注意,新的查询API仍处于测试阶段,因此在正式发布之前可能会发生变化
看这个
您可以查看Frank van Puffelen的原始帖子当前,您不能将.orderByPriority()
和.orderByChild()
混用,因为它们按函数顺序不同
但是,如果重新构建数据结构,您仍然可以仅使用.orderByPriority()
来解决问题
在您的案例中,您有一个“课程”的位置,所有课程都有一个“课程id”的push id键:/Lessons/$lessonID
您可以将结构更改为关闭课程id
,然后关闭课程id
:/lessions/$courseId/$lessonID
数据如下所示:
$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>
<ul>
<li class="lesson"
ng-if="lesson.moduleID == module.$id"
ng-repeat="lesson in lessons | orderBy:'Priority'"
lessonid="{{lesson.$id}}">
<lessonedit></lessonedit>
</li>
</ul>
{
"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);
var courseID=$state.params.courseID;
var ref=新的Firebase('.firebaseio.com/lessons');
var query=ref.child(courseID).orderByPriority();
var syncArray=$firebaseArray(查询);
您可以将其存储在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);
}
angular.module('app',['firebase')
.constant('FirebaseUrl','')
.service('RootRef',['FirebaseUrl',Firebase])
.factory(“课程”,课程)
.controller('MainCtrl',MainCtrl);
函数课程(RootRef){
返回函数课程(courseID){
var ref=RootRef.child(“课程”);
var query=ref.child(courseID).orderByPriority();
返回$firebaseArray(查询);
}
}
函数MainCtrl($scope、$state、Lessons){
var courseID=$state.params.courseID;
$scope.lessons=课程(courseID);
}
这不是一个属性不幸的是,priority内置在Firebase中,它们具有更新优先级的功能,但在这种情况下,它没有任何用处,因为您无法按优先级排序。我最终不得不添加一个priority属性,以使其正常工作。您使用此属性提取了多少数据?如果数据量较小,则这是一个很好的解决方案警告。但这无法扩展到更大的数据集。Firebase查询不是beta版,从2014年4月11日起就可以使用。有没有办法用这样的顺序ID创建课程?Firebase不是本机的。顺序/基于索引的ID不适合实时数据。当ID只是一个数字时,当索引更改时很容易发生冲突。推送id是唯一的,这有助于避免任何冲突和/或竞争条件。然后我无法使用推送id,我无法更改结构。我在项目中添加了一个名为priority
的新字段,我可以按此排序,这太糟糕了,因为我无法使用任何内置于set priority或orderBy priority方法的Firebase,但它可以按可以,没有太多麻烦。您可以通过更新顺序ID来迁移到推送ID。如果我的答案有效,请将其标记为已接受,以保持未应答队列干净。