Получение неопределенной переменной при попытке доступа к переменной из другого контроллера angularjs

0

Привет, я новичок в angularjs, и любая помощь будет оценена по достоинству. Я разрешаю пользователям службу, и моя служба выглядит так

'use strict';
app.factory('Auth', function ($firebaseSimpleLogin, FIREBASE_URL, $rootScope, $firebase) {
    var ref = new Firebase(FIREBASE_URL);
    var auth = $firebaseSimpleLogin(ref);
    var Auth = {
        register: function (user) {
            return auth.$createUser(user.email, user.password);
        },
        createProfile: function (user) {
            var profile = {
                userfirstname: user.fname,
                userlastname: user.lname,
                username: user.fname + " " + user.lname,
                userprofiletags: user.profiletags
            };
            var profileRef = $firebase(ref.child('profile'));
            return profileRef.$set(user.uid, profile);
        },
        login: function (user) {
            return auth.$login('password', user);
        },
        logout: function () {
            auth.$logout();
        },
        resolveUser: function () {
            return auth.$getCurrentUser();
        },
        signedIn: function () {
            return !!Auth.user.provider;
        },
        user: {}
    };
    $rootScope.$on('$firebaseSimpleLogin:login', function (e, user) {
        console.log('logged in');
        angular.copy(user, Auth.user);
        Auth.user.profile = $firebase(ref.child('profile').child(Auth.user.uid)).$asObject();
        console.log(Auth.user);
    });
    $rootScope.$on('$firebaseSimpleLogin:logout', function () {
        console.log('logged out');
        if (Auth.user && Auth.user.profile) {
            Auth.user.profile.$destroy();
        }
        angular.copy({}, Auth.user);
    });
    return Auth;
});

Я пытаюсь получить доступ к переменной userprofiletags из контроллера, как указано ниже

'use strict';
app.controller('PostsCtrl', function ($scope, $http, Post, $location, Auth) {
    $scope.user = Auth.user;
    $scope.signedIn = Auth.signedIn;
    $scope.logout = Auth.logout;
    $scope.usertags = $scope.user.profile.userprofiletags;
    console.log($scope.usertags);
    $scope.loadTags = function (query) {
        return $http.get('support/tags.json');
    };
    $scope.onChange = function (cbState) {
        $scope.message = "The switch is now: " + cbState;
    };
    $scope.posts = Post.all;
    $scope.post = {
        title: '',
        description: '',
        tags: [],
        Anonymous: 'false'
    };
    var createdtime = moment().format('MMMM Do YY, h:mm:ss a');
    $scope.submitQuestion = function () {
        $scope.post.createdTime = createdtime;
        $scope.post.creator = $scope.user.profile.username;
        $scope.post.creatorUID = $scope.user.uid;
        Post.create($scope.post).then(function (ref) {
            $location.path('/posts/' + ref.name());
        });
    };
    $scope.deletePost = function (post) {
        Post.delete(post);
    };
});

Когда я пытаюсь получить доступ к переменной из представления, используя {{user.profile.userprofiletags}}, он дает мне значения. но я получаю undefined как результат, когда я пытаюсь назначить переменную $ scope.usertags в моих PostsCtrl.

Я бы извинился, если бы не был достаточно ясен. Пожалуйста, помогите мне в этой ошибке. Ваша помощь очень ценится.

Теги:
angularfire

2 ответа

1

Я думаю, что проблема здесь в том, что console.log очень короткий после совершения вызова, так что в основном $scope.user.profile.userprofiletags не существует на данный момент времени, на самом деле он будет готов, когда это событие будет транслироваться '$firebaseSimpleLogin:login'

вы можете использовать $ watch и уничтожить его после получения данных

watchDestroyer = $scope.$watch('user.profile', function (newUserProfile) {
    if (typeof newUserProfile !== "undefined" && newUserProfile !== null) {
        $scope.user = newUserProfile
        watchDestroyer()
    }
})

или использовать мероприятие или использовать обещания

0

Поскольку вызовы Firebase являются асинхронными, Auth.user не определен в данный момент времени. Вы можете сделать что-то подобное в своем контроллере:

Auth.resolveUser().then(function(user) {
    $scope.usertags = user.profile.userprofiletags;
});
  • 0
    очень жаль за опечатку .. Я обновил код, и он все еще имеет ту же ошибку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню