2016-11-10 5 views
0

Я developping веб-приложение с ионными 1 и 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) отобразить идентификатор формирует мою БД, но (4) всегда неопределенные ...

Любая идея?

Благодаря

ответ

0

UPDATE:

Manuel, извините, я думаю, что я пропустил точку вашего вопроса. Вы правы, используя фабрику/службу, является правильным способом хранения состояния вашего приложения. Из вышеизложенного я не вижу причин, по которым ваш код не работает. Пользователь должен быть переназначен в другом месте, чтобы вы не видели неопределенного в (4), если вы не видите то же самое в (3). Для простоты я удалил ссылки на 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

Thanks GPicazo для уточнения. Я не понимаю, почему, но мой код все еще не работает. Я не очень хорошо знаком с этими понятиями Factory/Service, но не мог это быть, потому что в то время, когда я создаю экземпляр фабрики, пользовательский член пуст, тогда моя функция возвращается с этим неопределенным значением для пользователя I, который никогда не обновляется, затем ... –

0

Вы должны передавать аргументы при вызове updateSport в контроллере,

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

Спасибо за ваш быстрый ответ Sajeetharan, но я думал об этом, но вот моя проблема относительно этого решения: Я использую нг-повтора на мой взгляд, который заселяют и списком тумблеров, каждый на это привязать к sportid и как состояние «зарегистрировано» (true или false), но у меня нет доступа к идентификатору пользователя из моего представления, и я не уверен, что это лучшая практика для его просмотра. Как вы думаете? –

+0

вы должны иметь доступ, потому что переменные получают привязку от контроллера – Sajeetharan