2016-11-10 105 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