使用查询AngularFire检索记录

Mat*_*yev 7 angularjs firebase angularfire

我正在使用Firebase,Backend-as-a-Service,用于我的网站应用程序,由AngularJS编程.

我想使用db查询来获取记录,例如: WHERE name == 'The Legend Of Korra'

我在Firebase服务器中有一系列电视剧,JSON代码:

{
  "series" : {
    "-JkqSvwyDw5F9DvGUu6b" : {
      "createdAt" : 1426842959884,
      "creators" : "Michael Dante DiMartino,Bryan Konietzko",
      "description" : "The series follows the adventures of protagonist twelve-year-old Aang and his friends, who must bring peace and unity to the world by ending the Fire Lord's war against the other three nations.",
      "episode_reset" : true,
      "genres" : "Action,Adventure,Fantasy,Comedy-drama",
      "keywords" : "avatar,the last airbender",
      "name" : "Avatar: The Last Airbender",
      "official_website" : "http://nicktoons.nick.com/shows/avatar",
      "publish_date" : "2005-02-21",
      "updatedAt" : 1426843055127
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码来完成这项工作:

$scope.isSeriesValid = function(seriesName) {
    var seriesRef = new Firebase('http://<<firebaseapp>>.firebaseio.com/series');
    var seriesCollection = $firebaseArray(seriesRef);
    seriesCollection.$loaded(function() {
        angular.forEach(seriesCollection, function(seriesObject, index) {
            if(seriesObject.name == seriesName)
                return true;
        });
    });
    return false;
};
Run Code Online (Sandbox Code Playgroud)

我想在没有使用$firebaseArray和的情况下完成这项工作forEach.我该怎么做?

就像这样:

var seriesRef = new Firebase('http://<<firebaseapp>>.firebaseio.com/series');
var seriesObject = $firebaseObject(seriesRef.query({ name: seriesName }));
Run Code Online (Sandbox Code Playgroud)

Sin*_*lel 20

我有一些建议可能会有所帮助:

  • 看看这个有效的PLNKR示例.
    • 我在我的一个公开Firebase实例中复制了您的数据.
    • 您正在寻找的查询是 seriesCollectionRef.orderByChild("name").equalTo(seriesName)
    • 如果在输入中输入' Avatar: The Last Airbender'并单击"查找",您将获得匹配的系列对象.
  • 在我的示例中,我扩展了$firebaseArray服务以包括按名称查找特定系列的方法.
    • 请参阅有关扩展AngularFire服务的文档.
    • 您可以在不扩展服务的情况下完成相同的操作,请参阅最后一个代码段.

工厂

app.factory('SeriesFactory', function(SeriesArrayFactory, fbUrl){
  return function(){
    var ref = new Firebase(fbUrl+'/series');
    return new SeriesArrayFactory(ref);
  }
});

app.factory('SeriesArrayFactory', function($firebaseArray, $q){
  return $firebaseArray.$extend({
    findSeries:function(seriesName){
      var deferred = $q.defer();
      // query by 'name'
      this.$ref().orderByChild("name").equalTo(seriesName).once("value", function(dataSnapshot){
        if(dataSnapshot.exists()){
          deferred.resolve(dataSnapshot.val());
        } else {
          deferred.reject("Not found.");
        }
      });
      return deferred.promise;
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

调节器

app.controller('HomeController',function($scope, SeriesFactory, fbUrl) {

  $scope.seriesName = '';

  $scope.findSeries = function() {
    console.log("Finding series with name:'",$scope.seriesName,"'");
    var seriesCollection = new SeriesFactory();
    seriesCollection.findSeries($scope.seriesName).then(function(data){
      console.log("Found",data);
      $scope.series = data;
    }).catch(function(error){
      console.warn(error);
    });
  };

});
Run Code Online (Sandbox Code Playgroud)

没有扩展服务

如果您不使用工厂,这就是控制器功能的样子:

  $scope.findSeriesWithoutFactory = function() {
    var seriesRef = new Firebase(fbUrl+'/series');
    var seriesCollection = $firebaseArray(seriesRef);
    seriesCollection.$ref().orderByChild("name").equalTo($scope.seriesName).once("value", function(dataSnapshot){
        var series = dataSnapshot.val();
        if(dataSnapshot.exists()){
          console.log("Found", series);
          $scope.series = series;
        } else {
          console.warn("Not found.");
        }
    });
  };
Run Code Online (Sandbox Code Playgroud)

规则

注意:请务必注意,您应该添加".indexOn":"name"Firebase规则,以便查询高效运行.像这样:

  "yourfirebaseapp": {
    ".read": "...",
    ".write": "...",
    "series": {
      ".indexOn": "name"
    }
  }
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!