我正在使用Ionic 1和AngularJS 1开发一个Web应用程序。
在我的工厂(UserFact):
.factory('UserFact', function() {
var user = [];
return {
'setUser': function(user) {
this.user = user;
console.log('(2) User set: ' + this.user);
console.log('(3) User id is now: ' + this.user.uid);
},
'updateSport': function(sportid, registered) {
console.log('Update sport: ' + sportid + ' --> ' + registered);
console.log('(4) For user uid: ' + this.user.uid);
var ref = firebase.database().ref('users/' + this.user.uid + '/sports/');
// sync down from server
var list = [];
ref.on('value', function(snap) { list = snap.val(); });
if(registered) {
list.splice(0, 0, {id: sportid});
} else {
}
ref.set(list);
}
};
})
在我的控制器中:
function ($scope, $stateParams, $state, DatabaseFact, UserFact) {
// variables
$scope.sports = [];
$scope.sports = DatabaseFact.getSports();
// functions
$scope.updateSport = UserFact.updateSport;
// execution
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
UserFact.setUser(user);
console.log('(1) Ctrl user uid: ' + user.uid);
}
});
}
根据控制台:logs(1),(2)和(3)显示我的数据库的用户标识,但(4)始终未定义...
有什么想法吗?
由于
答案 0 :(得分:0)
您需要在控制器中调用updateSport
时传递参数,
$scope.updateSport = UserFact.updateSport(userid,registered);
答案 1 :(得分:0)
更新:
曼努埃尔,对不起,我想我错过了你的问题。你是正确的,使用工厂/服务,是存储应用程序状态的正确方法。从上面看,我没有看到你的代码不起作用的原因。如果您在(3)中没有看到相同的内容,则必须在其他地方重新分配用户,以便您在(4)中看到未定义。为简单起见,我删除了对firebase的引用并创建了一个工作演示:https://plnkr.co/edit/vaN7ySche8GgRQmZgFsa?p=preview虽然演示可能无法解决您的问题,但我希望它说明工厂变量(用户)持久存储在内存中并可用于多个工厂方法调用。
以下的原始答案(遗漏的要点):
更新状态更改处理程序以将用户保存在控制器范围内:
firebase.auth().onAuthStateChanged(function(user) {
if (user) {
$scope.user = user;
UserFact.setUser(user);
console.log('(1) Ctrl user uid: ' + user.uid);
}
});
然后,在模板中,使用用户范围变量调用updateSport方法:
updateSport(user, true);
或
updateSport(user, false);