【问题标题】:TypeError: undefined is not a function with Firebase and AngularJS (ThinksterIO Tutorial Chapter 7)TypeError: undefined is not a function with Firebase 和 AngularJS(ThinksterIO 教程第 7 章)
【发布时间】:2014-10-29 07:13:57
【问题描述】:

更新

教程已更新,问题现已过时


我在 Thinkster.io AngularJS 教程中遇到了多个问题:学习构建现代 Web 应用程序 Chapter 7. Creating your own user data using firebase

第一个与将新用户保存到 Firebase Forge 有关,幸运的是 Anna Smother 在她的 SO 帖子 AngularJS tutorial Thinkster.io chapter 7 中解决了这个问题,但现在我在注册新用户后收到了两个 TypeErrors。我将解释当我注册一个新用户时会发生什么:

  1. 我填写注册表
  2. 我点击注册
  3. 我看到我的新用户对象已登录到控制台
  4. 我已登录
  5. 控制台出现2个TypeError: undefined is not a function错误


1st TypeError: undefined is not a function

所以看看第一个错误,我们看到我的user.js 中指向了 3 个地方

TypeError: undefined is not a function
    at Object.User.findByUsername (http://localhost:9000/scripts/services/user.js:37:18)
    at setCurrentUser (http://localhost:9000/scripts/services/user.js:8:33)
    at http://localhost:9000/scripts/services/user.js:32:5

我的代码中第一个错误指向的第一个位置是第 37 行第 18 列,它是 $childin thefindByUsername` 函数的开头

findByUsername: function (username) {
  if (username) {
    return users.$child(username);
  }
},

从那里它指向第 8 行第 33 列,这是 findByUsername 方法调用的开始

function setCurrentUser(username) {
  $rootScope.currentUser = User.findByUsername(username);
}

最后它指向第 32 行第 5 列,这是 setCurrentUser 方法调用的开始

  users.$save().then(function() {
    setCurrentUser(username);
  });

2nd TypeError: undefined is not a function

第二个TypeError只指向user.js中的一个地方

TypeError: undefined is not a function
    at http://localhost:9000/scripts/services/user.js:14:9

这是$on方法调用开头的第14行第9列

query.$on('loaded', function () {
  setCurrentUser(query.$getIndex()[0]);
});

关于我为什么会收到这两个 TypeErrors 的任何想法?


文件

user.js服务

'use strict';

app.factory('User', function ($firebase, FIREBASE_URL, $rootScope) {
  var ref = new Firebase(FIREBASE_URL + 'users');
  var users = $firebase(ref).$asObject();

  function setCurrentUser(username) {
    $rootScope.currentUser = User.findByUsername(username);
  }

  $rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid));

    query.$on('loaded', function () {
      setCurrentUser(query.$getIndex()[0]);
    });
  });

  $rootScope.$on('$firebaseSimpleLogin:logout', function() {
    delete $rootScope.currentUser;
  });

  var User = {
    create: function (authUser, username) {
      users[username] = {
        /*jshint camelcase: false */
        md5_hash: authUser.md5_hash,
        username: username,
        $priority: authUser.uid
      };
      users.$save().then(function() {
        setCurrentUser(username);
      });
    },
    findByUsername: function (username) {
      if (username) {
        return users.$child(username);
      }
    },
    getCurrent: function () {
      return $rootScope.currentUser;
    },
    signedIn: function () {
      return $rootScope.currentUser !== undefined;
    }
  };

  return User;
});

auth.js 控制器

'use strict';

app.controller('AuthCtrl',
  function ($scope, $location, Auth, User) {
    if (Auth.signedIn()) {
      $location.path('/');
    }

    $scope.$on('firebaseSimpleLogin:login', function() {
      $location.path('/');
    });

    $scope.login = function() {
      Auth.login($scope.user).then(function() {
        $location.path('/');
      }, function(error) {
        $scope.error = error.toString();
      });
    };

    $scope.register = function () {
      Auth.register($scope.user).then(function (authUser) {
        User.create(authUser, $scope.user.username);
        $location.path('/');
        Auth.login($scope.user);
        console.log(authUser);
      }, function(error) {
        $scope.error = error.toString();
      });
    };
  });

【问题讨论】:

标签: angularjs firebase angularfire firebasesimplelogin


【解决方案1】:

在编辑 1 中查看我的解决方案:我已经更新了代码,这应该会在您注册时消除您的错误吗?

从 angularfire 0.8 版开始,他们已经去掉了 $child() 和 $on(),我将在今晚(当我回到家时)更新我的编辑 2 的解决方案。

AngularJS tutorial Thinkster.io chapter 7

也可以看看这个:

AngularFire api

【讨论】:

  • 是的,您编辑的解决方案:1 解决了第一个 TypeError。我很期待你如何处理第二个问题。我查看了 API,实际上看到了“登录相关事件”部分的代码示例,他们在其中使用了 $rootScope.$on() 信不信由你 firebase.com/docs/web/libraries/angular/… 我让他们知道了。
  • @s3z:我已经更新了我的第二个编辑(编辑 2),你可以看看。
  • 再次感谢安娜。因此,在实施了两个修复后,我又得到了两个与.$child().$on() 相关的新类型错误(发生在 post.js 服务中)。它们发生在我提交帖子并尝试删除帖子时。我试图根据您以前的修复来弄清楚如何解决它们,但是,我只是不知道足够的 JS 来解决这个级别的问题。我在这篇文章的更新 1 中包含了这两个新的 TypeErrors 以及我的 post.js 代码。如果你有时间可以看看吗?我将不胜感激:)
  • @s3z:我建议开一个新帖子,因为这些都是新问题。除此之外,我用简单的方法做到了。由于他们删除了 $firebase() 对象上的 $child() 和 $on(),因此您可以使用它们。如果您使用的是 $firebase(ref),例如: var postref = $firebase(ref);你可以调用 postref.$ref().child() 或者你可以使用 var ref = new Firebase(url); ref.child("posts").chid(postId).remove()。对于 $on(),只需使用 $loaded()(在这种情况下)。
  • 好的,我在这里打开了一个新帖子stackoverflow.com/questions/25692853/… 所以我阅读了你关于做什么的解释,但我意识到我需要实际的完整代码示例才能真正开始理解它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 2015-06-24
  • 2021-06-21
  • 1970-01-01
  • 2015-12-09
相关资源
最近更新 更多