3

我想弄清楚如何用 angular + firebase 做一个简单的 CRUD。我从读取操作开始。我有以下数据结构:在此处输入图像描述

鉴于此,我创建了以下规则: 在此处输入图像描述

我有一个工作工厂如下:

factory('wordsFactory', function($http){
  var factory = {};
  var words = [
    {content:"hi", definition:"ooo"},
    {content:"h3", definition:"ooo222"}
  ];
  factory.getWords = function(){
    return words;
    //ajax call here
  };
  factory.addWords = function(){
    //something
  }
  return factory;
})

我对其进行了修改以尝试像这样包含调用:

factory('wordsFactory', function($http){
  var factory = {};
  var words = [];
  var ref = new Firebase('https://my-firebase.firebaseio.com/words');
    ref.once('value', function($scope, snapshot) {
        $scope.variable = snapshot.val();
        words = [
          {content: ref.content, definition: ref.definition}
        ];
  });
  factory.getWords = function(){
    return words;
    //ajax call here
  };
  factory.addWords = function(){
    //something
  }
  return factory;
})

但是,每当我尝试阅读时,我都会得到:

Error: permission_denied: Client doesn't have permission to access the desired data.

FIREBASE WARNING: Exception was thrown by user callback. TypeError: Cannot read property 'val' of undefined

许多事情,我意识到由于我拥有它的方式,即使它有效,它也只会返回 1 个值。我现在可以接受,因为我只是想弄清楚如何让它工作。我也知道我当前的数据结构可以大大改进,我再次这样做只是为了学习,但随时提出您认为可能对我有帮助的任何建议。

我现在主要担心的是我无法阅读它。我还应该提到,工厂在没有 firebase 的情况下正常工作,它在主控制器中被调用。

4

2 回答 2

1

我认为您的问题与规则有关。

尝试将默认规则替换为以下内容:

{
  "rules": {    
     ".read": true,
     ".write": true
  }
}

现在您可以访问而不会出现任何错误。

于 2016-10-29T08:15:22.130 回答
0

我不确定你是怎么想到这个结构的:

ref.once('value', function($scope, snapshot) {

但是once回调只需要一个value事件参数。请参阅相关的 Firebase API 文档

因此,您必须将其更改为:

ref.once('value', function(snapshot) {

并找到另一种方法来获取范围。

为了对失败的读取操作进行故障排除,我建议使用 Firebase 仪表板中的模拟器选项卡。它通常会更好地解释操作被拒绝的原因。此详细信息有意不在常规客户中显示。

于 2015-05-25T03:34:56.007 回答