【问题标题】:Can't access array in sync with Firebase无法访问与 Firebase 同步的阵列
【发布时间】:2015-12-18 12:42:25
【问题描述】:

我正在开发一个 Ionic 应用程序。它基本上是一个测验,用户发布一些问题的答案。

这是我的数据库结构

user{
    userID (autogenerated by Firebase){
          name:
          surname:
          questionsAnswered:
answers{
       userID (linked with users){
          question1answer:
          question2answer:
          ...

如您所见,没有答案 ID。我这样做是因为我认为我不需要一个。 如有错误请指正

我的用户数据与 Firebase 同步,但我无法从答案部分检索数据。

这是控制器的一些代码。

.controller('ConcursoCtrl', function($scope, controlDatos, $firebaseArray, $cordovaCamera)

$scope.myAnswers = {};

var uid = "-K5omNwU5rpo1Z4WvpnQ"; //This is just for test purposes

var myAnswersRef = new Firebase('https://url.firebaseio.com/answers/'+ uid);
$scope.myAnswers = $firebaseArray(myAnswersRef);

console.log('Answer 1', $scope.myAnswers.question1answer);
console.log($scope.myAnswers);

第一个控制台日志不返回任何内容。第二个日志返回的对象与数据库中的答案一样多(已检查),所以我知道它可以正常访问,但我无法获得不同答案的值。

[object Object],[object Object],[object Object],[object Object]

¿我是否试图通过 $scope.myAnswers.question1answer 错误地访问数据?

【问题讨论】:

    标签: javascript angularjs ionic firebase angularfire


    【解决方案1】:

    如您所见,没有答案 ID。我这样做是因为我 以为我不需要一个。 如有错误请指正

    你确实有一个answer_id

    在构建数据时,请结合安全规则考虑它们。

    {
       "answers": {
          "$uid": {
             "$answer_id": {
    
             }
          }
       }
    }
    

    这会生成answers/$uid/$answer_id 的路径,因此$uid 位置下的每个键都是$answer_id

    现在,进入显示问题。

    第一个控制台日志不返回任何内容。

    您正在处理异步数据,因此在 console.log() 运行时尚未下载。这没关系,因为 AngularFire 会在数据下载完成后触发 Angular 的 $digest 循环。

    所以您需要做的就是将answers 附加到作用域。

    // create a root ref
    var ref = new Firebase('<my-firebase-app>');
    // create a ref to the user's answers using .getAuth() and the uid
    var myAnswersRef = root.child('answers').child(root.getAuth().uid);
    // assign answers to $scope
    $scope.answers = $firebaseArray(myAnswersRef);
    

    现在您应该可以通过简单的ng-repeat 在模板中使用它:

    <ul ng-repeat="answer in answers">
       <li> {{ answer.text }} </li>
    </ul>
    

    【讨论】:

    • 我没有将答案附加到范围吗? var myAnswersRef = new Firebase('https://url.firebaseio.com/answers/'+ uid); $scope.myAnswers = $firebaseArray(myAnswersRef);我在项目中没有任何认证,所以即使 uid 具有用户的密钥,您的答案也会返回“TypeError:无法读取 null 的属性 'uid'”。我在发帖之前尝试查看一些信息,但恐怕我对 firebase/angularFire 的了解太低,无法理解基础知识。
    • 如果没有授权,它应该是这样的,var myAnswersRef = ref.child('respuestas').child(uid); rigth?它做同样的事情并返回[object Object]。我试图从一个函数中调用日志,也看看它是否是一个计时的东西,但我还是一样。
    • 你能把它变成 JSFiddle 或 Plnkr 吗?这样我可以更轻松地帮助调试它。
    • link 这是 jsfiddle。有一个用“InicioCtrl”控制的登录屏幕。这很简单,所以我没有把它放在那里。大多数变量和内容都是西班牙语,但非常简单。参与者=用户。 Respuestas = 答案。 Reto = 问题。 wut 函数只是获取变量的日志。如果我在不到一秒钟的时间内按下它,它就会返回空。如果我在按下它之前稍等片刻,它会返回空 + [object Object]
    • 你好。当我将 firebase url 附加到“firebaseurl/answers”时,我可以看到所有答案都在做&lt;ul ng-repeat="answer in answers "&gt; &lt;li&gt; {{ answer.question1answer}} &lt;/li&gt; &lt;/ul&gt;,但我得到的是所有用户的 question1answer 的所有答案。我需要得到的是一个用户的所有答案。我确定这是我不了解数据库的问题。这是数据库结构的图片。 link
    【解决方案2】:

    我回答我自己的问题,以防有人犯同样的错误。

    基本上,我试图用 $firebaseArray 检索单个对象,用于检索对象数组。

    使用 $firebaseArray 和 /root/answers 路径 我可以检索 用户回答的所有问题。 这可能会占用大量数据,因为强制所有用户下载所有数据(有图片存储在firebase中)。

    我只是使用 $firebaseObject下载我需要的单个对象

    希望这对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2014-07-02
      • 2012-12-16
      • 2010-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多