0

更新:教程已更新,以下问题确实不再适用


从网站 thinkster.io(免费电子书)了解 AngularJS。但目前我被困在第 7 章 - 使用 firebase 创建自己的用户数据。这是一个关于使用 firebase 的 angularjs 的教程。

我已经根据站点编写了所有代码,但是当我想注册用户时出现这些控制台错误。它将创建用户(在 firebase -simpllogin 中),但不会创建用户对象(在 firebase - data 中)。:

TypeError: undefined is not a function
at Object.User.create (http://localhost:9000/scripts/services/user.js:46:19)
at http://localhost:9000/scripts/controllers/auth.js:32:22
etc.

这是代码(与站点相同),错误在 create() 函数中并讨论 users.$save() 函数,User.create() 的片段:

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

user.js的完整代码:

news.factory("User", function ($firebase, FIREBASE_URL, $rootScope, $log) {
    var reference, users, User;

    reference = new Firebase(FIREBASE_URL + "users");
    users = $firebase(reference);

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

    $rootScope.$on("$firebaseSimpleLogin:login", function (event, authUser) {
        var query = $firebase(reference.startAt(authUser.uid).endAt(authUser.uid));

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

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

    User = {
        create: function (authUser, username) {
            users[username] = {
                md5_hash: authUser.md5_hash,
                username: username,
                "$priority": authUser.uid
            };

            $log.debug(users);

            users.$save(username).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;
});

编辑 1: 注册用户现在可以工作,让它工作(保存在 firebase,简单的登录和数据):

users = $firebase(reference).$asObject();

注意 users.save() 函数:

        create: function (authUser, username) {
            users[username] = {
                md5_hash: authUser.md5_hash,
                username: username,
                $priority: authUser.uid
            };

            $log.debug(users);

            users.$save().then(function () {
                setCurrentUser(users);
            });
        },
        findByUsername: function (users) {
            if (users) {
                return users;
            }
        },

编辑2: 现在我在用户登录时遇到错误(见下文),当我想登录时,我在这个函数上遇到错误,query.$on():

TypeError: undefined is not a function
at http://localhost:9000/scripts/services/user.js:26:19
    $rootScope.$on("$firebaseSimpleLogin:login", function (event, authUser) {
        var query = $firebase(reference.startAt(authUser.uid).endAt(authUser.uid));

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

现在有什么问题?

4

2 回答 2

0

这是编辑 2 的答案:我使用了 firebase(ref)、query.$loaded 并搜索了正确的对象,就是这样。也许有人有不同的答案,请张贴他们:)。

我终于完成了第07章!

一般来说(编辑2的解决方案):

    $rootScope.$on("$firebaseSimpleLogin:login", function (event, authUser) {
        var query = $firebase(reference).$asObject();

        query.$loaded(function (result) {
            angular.forEach(result, function (key) {
                if (key.md5_hash === authUser.md5_hash) {
                    setCurrentUser(key);
                }
            });
        });
    });

这不是理想的解决方案,但免费电子书(写作的 atm)远非理想。再说一次,这些情况可以帮助您更多地了解 firebase api 以及它如何与 angular 一起工作。但有时可能会感到沮丧,当您只想完成教程时;)。

笔记!我保存了用户对象并将用户对象传递给 findUsername() 和 setCurrentUser() 函数,而不仅仅是 user.username。

您还可以使用本机数组函数,例如 some()。

于 2014-09-02T23:24:41.760 回答
0

我认为您的系统使用较新版本的 Angularfire(版本>= 0.8)。这意味着要通过数组循环运行......您需要.$asArray()在用户定义字段的末尾附加。检查 Firebase 的更新。

于 2014-09-30T15:02:57.187 回答