2014-10-23 3 views
3

Я использую Firebase в качестве основного основного решения и создал службу для работы с auth во всем приложении (так как я начал использовать simpleLogin, и теперь я Я пытаюсь использовать свои встроенные методы входа, я решил, что лучше всего сделать все, что охвачено, прежде чем обращаться к нему из остальной части приложения).firebase onAuth() throwing: TypeError не может прочитать свойство «auth» undefined

Ссылка на мою базовую базу работает отлично, и поэтому это методы auth.
методы Но прослушивания onAuth() и offAuth() бросают эту ошибку:

Uncaught TypeError: Cannot read property 'auth' of undefined - firebase-debug.js:9954

Является ли это ошибка с самим или кто-нибудь увидеть что-то я делаю неправильно firebase? Пытался поиграть с угловыми версиями и выключить другие пакеты для сидения, такие как угловые огни и firebase-simple-login, но пока не добились успеха.

Мой код служебной службы выглядит следующим образом, и я не делаю ничего, кроме определения моего URL-адреса в службе .constant.

angular.module('myApp') 
    .factory('auth', function (firebaseAPIUrl) { 

     var ref = new Firebase(firebaseAPIUrl), 
      onAuth = ref.onAuth, 
      offAuth = ref.offAuth; 

     onAuth(function (authData) { 
     console.log(authData); 
     }); 

     function getCurrentUser() { 
     return ref.getAuth(); 
     } 

     ... 

     return { 
     onAuth: onAuth, 
     offAuth: offAuth, 
     getCurrentUser: getCurrentUser, 
     ... 
     } 
    } 
+0

Вместо того, чтобы возвращать 'onAuth',' offAuth' и т. Д., Что происходит, когда вы пытаетесь вернуть 'onAuth.bind (ref)' и т. Д.? Кроме того, какая версия веб-клиента Firebase включена в ваше приложение? –

+0

@RobDiMarco Я работаю на 1.1.2, так как это первый, который включает логин в качестве основной части firebase, не так ли? Но я не получил ваше предложение. Свойство onAuth, которое я выставляю, будет определяться как «var onAuth = ref.onAuth.bind (ref);' - это то, что он? –

+0

@RobDiMarco, когда я оставляю его так: 'onAuth = ref.onAuth.bind (ref)' и т. Д., Он отлично работает. Но я ничего не нашел об этом в документах. Можете ли вы рассказать об этом в ответ, чтобы я мог принять его? Благодаря! –

ответ

5

В JavaScript, при прохождении вокруг функции для последующего вызова, важно помнить о объема, с которой эта функция будет вызываться. Например, при определении закрытий закрытие будет иметь свой собственный объем, и this может больше не указывать на наш оригинальный объект. Использование fn.bind(...) решает эту проблему.

Это может показаться сложным, поскольку код, с которым вы работаете, может зависеть от конкретной области. Трюк состоит в том, чтобы гарантировать, что область действия не изменилась, поскольку вы передаете функцию в качестве аргумента, и это может быть достигнуто явно , связывая с методом исходного объекта перед его передачей.

Отъезд http://www.reactive.io/tips/2009/04/28/binding-scope-in-javascript/ и http://alistapart.com/article/getoutbindingsituations для более глубоких погружений на эту тему.

+1

Спасибо! Поддержка Firebase была полезной. Идти на полпути с вами, ребята, были отличным выбором :) –

+0

Я вот-вот задал такой вопрос. Вы не представляете, сколько времени эта информация спасла меня. благодаря –

Смежные вопросы