angularjs - Firebase - 按列过滤

标签 angularjs firebase angularfire

我正在将 Firebase 用于我的 Angular.js 应用程序。

我正在寻找 Firebase 的 SQL WHERE 语句的等效项。

我在 Firebase 中存储了一系列电视剧,我只想获取具有用户输入名称的电视剧(在示例 searchQuery 中)。

Firebase 支持吗?有这样的东西吗?

var seriesRef = new Firebase('http://{app}.firebaseio.com/series');
var seriesObject = $firebaseObject(seriesRef.query({ name: searchQuery }));

最佳答案

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

示例

  • 查看此工作 CodePen demo
    • 我已将您的数据复制到我的一个公共(public) Firebase 实例中。
    • 您要查找的查询是seriesCollectionRef.orderByChild('name').equalTo(seriesName)
    • 如果您在输入框中输入“Avatar: The Last Airbender”并点击“查找”,您将获得匹配的系列对象。
  • 在我的示例中,我扩展了 $firebaseArray 服务,以包含按名称查找特定系列的方法。
    • 请参阅 extending AngularFire services 的文档.
    • 您可以在不扩展服务的情况下完成同样的事情,请参阅最后一个代码片段。

工厂

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

app.factory('SeriesArrayFactory', function($firebaseArray, $q) {
  return $firebaseArray.$extend({
    findSeries: function(seriesName) {
      const deferred = $q.defer();

      // query by 'name'
      this.$ref()
        .orderByChild('name')
        .equalTo(seriesName)
        .once('value', function(dataSnapshot) {
          if (dataSnapshot.exists()) {
            const value = dataSnapshot.val();
            deferred.resolve(value);
          } else {
            deferred.reject('Not found');
          }
        })

      return deferred.promise;
    }
  });
});

Controller

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

  $scope.findSeries = function() {
    const seriesCollection = new SeriesFactory();

    seriesCollection
      .findSeries($scope.seriesName)
      .then(function(data) {
        $scope.series = data;
      })
      .catch(function(error) {
        console.error(error);
      });
  };
});

没有扩展服务

如果不使用工厂, Controller 函数将如下所示:

$scope.findSeriesWithoutFactory = function() {
  const seriesRef = new Firebase(`${fbUrl}/series`);
  const seriesCollection = $firebaseArray(seriesRef);

  seriesCollection.$ref()
    .orderByChild('name')
    .equalTo($scope.seriesName)
    .once('value', function(dataSnapshot) {
      if (dataSnapshot.exists()){
        $scope.series = dataSnapshot.val();
      } else {
        console.error('Not found.');
      }
    });
};

规则

注意:请务必注意,您应该将 ".indexOn": "name" 添加到您的 Firebase 规则中,以便查询高效运行。请参阅Indexing Your Data Firebase 的一部分 Security & Rules Guide了解更多信息。下面是一个例子:

"yourfirebaseapp": {
  ".read": "...",
  ".write": "...",
  "series": {
    ".indexOn": "name"
  }
}

关于angularjs - Firebase - 按列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29164753/

相关文章:

javascript - 使用 $add angularfire 生成自定义 key

javascript - Angular中与同级指令/ Controller 相关的列表(和主控/详细信息)

javascript - 双大括号不显示我想要的内容

android - 通过下载 URL 显示来自 firebase cloud firestore 的图像

firebase - 更新 Firebase 实时数据库对象中的特定值

Angular js : How to authenticate before route changes

javascript - 来自 json 数据的数组中的 AngularJS 过滤器数组

javascript - 调用时 ng-class 不工作

java - 我正在尝试根据用户选择的日期过滤 firestore 内容。说显示 2 月 14 日的所有数据

angular - 错误 NG6002 : Appears in the NgModule. 导入 AppModule,但无法解析为 NgModule 类