【问题标题】:AngularJS - Update a variable of a factory from a controllerAngularJS - 从控制器更新工厂的变量
【发布时间】:2016-11-10 17:17:03
【问题描述】:

我正在使用 Ionic 1 和 AngularJS 1 开发一个网络应用程序。

在我的工厂(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);
    }
});

}

根据控制台:日志 (1)、(2) 和 (3) 显示我的数据库的用户 ID,但 (4) 始终未定义...

有什么想法吗?

谢谢

【问题讨论】:

    标签: angularjs ionic-framework factory


    【解决方案1】:

    更新:

    Manuel,对不起,我想我错过了你问题的重点。您是对的,使用工厂/服务是存储应用程序状态的正确方法。从上面看,我看不出您的代码不起作用的原因。如果您在 (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);
    

    【讨论】:

    • 我想我明白你的意思:将用户存储在 $scope 中并将其从模板传递给控制器​​。但在全球范围内,我将工厂视为一种类(我更习惯于 C++ 和 Java),那么如果我无法从同一个工厂的函数中访问变量,那么在工厂中拥有变量有什么意义呢?谢谢!
    • 感谢 GPicazo 的澄清。我不明白为什么,但我的代码仍然无法正常工作。我不太熟悉工厂/服务的这些概念,但这不可能是因为在我实例化工厂时,用户成员是空的,然后我的函数返回了这个未定义的用户值,然后我永远不会更新......
    • 但是你说输出(2)和(3)输出正确的用户信息。如果是这样,那么用户就不会是空的。
    • 同意...但不幸的是它并没有像我们预期的那样工作。
    【解决方案2】:

    在控制器中调用updateSport时需要传递参数,

    $scope.updateSport = UserFact.updateSport(userid,registered);
    

    【讨论】:

    • 感谢您的快速回答 Sajeetharan,但我想到了这一点,但这是我关于此解决方案的问题:我在视图中使用 ng-repeat 填充和切换列表,每个 on 都绑定到sportid 并作为“已注册”状态(真或假),但我无法从我的视图中访问用户 ID,我不确定将它放在视图中是否是最佳实践。你怎么看?
    • 你应该可以访问,因为变量是从控制器绑定的
    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 2014-05-02
    相关资源
    最近更新 更多