Привет, я новичок в 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.
Я бы извинился, если бы не был достаточно ясен. Пожалуйста, помогите мне в этой ошибке. Ваша помощь очень ценится.
Я думаю, что проблема здесь в том, что 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()
}
})
или использовать мероприятие или использовать обещания
Поскольку вызовы Firebase являются асинхронными, Auth.user
не определен в данный момент времени. Вы можете сделать что-то подобное в своем контроллере:
Auth.resolveUser().then(function(user) {
$scope.usertags = user.profile.userprofiletags;
});