2016-11-10 60 views
0

我与深化发展离子1 web应用程序和AngularJS 1.AngularJS - 从控制器更新工厂的可变

在我厂(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)总是未定义...

有什么想法?

感谢

回答

0

UPDATE:

曼努埃尔,对不起,我想我已经错过了你的问题点。你是正确的,使用工厂/服务,是正确的方式来存储你的应用程序的状态。从上面,我没有看到你的代码不工作的原因。如果您在(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); 
+0

我想我明白了:将用户存储在$ scope中并将其从模板传递给控制器​​。但更全球化的是,我将工厂视为一种类(我更习惯于C++和Java),那么如果我无法在同一工厂的某个函数中访问它,那么在工厂中拥有变量的意义何在?谢谢! –

+0

以上更新答案 – GPicazo

+0

感谢GPicazo的澄清。我不明白为什么,但我的代码仍然无法正常工作。我不是很熟悉Factory/Service的这些概念,但不可能是因为在我实例化工厂的时候,用户成员是空的,那么我的函数返回给用户I的这个未定义的值永远不会更新,然后... –

0

你需要传递的参数,同时调用控制器updateSport

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

感谢您的快速回答Sajeetharan但我想到这一点,但这里是我关于这个解决方案的问题:我用NG-重复在我看来,其中填充和切换的列表,每个上绑定到sportid和作为状态“注册”(true或false),但我无法从我的视图中访问用户标识,我不确定在视图中使用它是否是最佳做法。你怎么看? –

+0

你应该能够访问,因为变量是从控制器绑定的 – Sajeetharan