Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

180
Vistas
AngularJS: onChanges no se activa con Firebase authWithCustomToken

Tengo una aplicación que establece una conexión con Firebase realtime db, a través de authWithCustomToken y obtiene algunos datos.

El flujo es el siguiente:

El componente principal => activa el Servicio (establece la conexión) => El principal recibe datos del Servicio y los envía al componente secundario a través del enlace. El componente secundario tiene un enlace de ciclo de vida onChanges para reaccionar en la actualización del enlace.

Problema: onChange no se activa cuando se actualiza el enlace

Servicio:

 ... self.data = null; self.authenticate = function() { return $http.get('/api/v2/fbtoken') .then(function(res) { const ref = new Firebase(firebaseBaseUrl); return ref.authWithCustomToken( res.data, saveData(error, authData); ); }); }; function saveData(error, authData) { if(error) { return false; } self.data = authData; return true; } self.getData() { return self.data; }

padre.componente.html:

 <child-component notification-list="ParentCtrl.notifications"></child-component notification-list>

padre.componente.js:

 ... function ParentCtrl( Service ) { const viewModel = this; viewModel.notifications = null; Service.authenticate() .then((data) => { viewModel.notifications = Service.getData(); }); }

niño.componente.js:

 ... .component('childComponent', { bindings: { notificationList: '<' }, templateUrl: 'someUrl', controller: 'ChildCtrl as ChildCtrl' }) ... function ChildCtrl() { const viewModel = this; viewModel.$onChanges = onChanges; function onChanges(changes) { if (changes) { // Not triggered console.log('binding has changed'); } } }

Sé que AngularJS no sabe nada sobre Promise nativo y no se activa la detección de cambios. Para forzar changeDetection, necesitamos usar la biblioteca $q para eso. Pero este ejemplo usa el cliente AngularJS $http que devuelve $q.promise.

La biblioteca Wrapper Angularfire para el cliente de Firebase también devuelve una promesa de $q bajo el capó:

 FirebaseAuth = function($q, $firebaseUtils, ref) { this._q = $q; ... authWithCustomToken: function(authToken, options) { var deferred = this._q.defer(); try { this._ref.authWithCustomToken(authToken, this._utils.makeNodeResolver(deferred), options); } catch (error) { deferred.reject(error); } return deferred.promise; }

Si para comentar parte con authWithCustomToken => se activa la detección de cambios, se cambia la variable en el elemento principal, se actualiza el enlace en el elemento secundario y también se activa el gancho onChanges.

Pero con la parte authWithCustomToken, la variable en Parent se cambia, pero este cambio no se refleja en el enlace del niño y el gancho onChanges no se activa.

¿Que me estoy perdiendo aqui?

about 4 years ago · Juan Pablo Isaza
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda