Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何在Firebase和Angular中获取特定元素和orderby优先级_Angularjs_Firebase_Angularfire - Fatal编程技术网

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

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

我有这样一个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>
<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。如果我的答案有效,请将其标记为已接受,以保持未应答队列干净。