AngularJS - 从控制器更新工厂的变量

时间:2016-11-10 17:17:04

标签: angularjs ionic-framework factory

我正在使用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)始终未定义...

有什么想法吗?

由于

2 个答案:

答案 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);