Ember.js: Inyectar el servicio de enrutador en EmberRouter se repite infinitamente

Creado en 22 mar. 2019  ·  8Comentarios  ·  Fuente: emberjs/ember.js

Muestra de código:

// app/router.js
const Router = EmberRouter.extend({
  location: config.locationType,
  rootURL: config.rootURL,

  routerService: service('router'),

  init() {
    this.routerService.on('routeDidChange', () => {});
  }
});

Reproducción: https://github.com/ember-triage/emberjs-17791

PD Al inyectar router en EmberRouter también se rompe.

Bug Has Reproduction Router Bugs

Comentario más útil

@ursqontis para el registro, puede escuchar los eventos del enrutador desde dentro del enrutador. Solo debería necesitar hacer this.on('routeDidChange') . Este fragmento tiene el ejemplo de trabajo: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Todos 8 comentarios

Según nuestra discusión sobre la discordia, la inyección del enrutador funciona, pero debe invocar this._super(...arguments);https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8
Mi error; combinó esto con garantizar que pueda registrar eventos de enrutamiento desde la instancia del enrutador.

@efx ese fragmento de código no está inyectando el servicio del enrutador, ¡creo que es una situación diferente!

También puedo confirmar este comportamiento, en Ember 3.8

Código:

import EmberRouter from '@ember/routing/router';
import config from './config/environment';
import { set } from '@ember/object';

import { inject as service } from '@ember/service';


const Router = EmberRouter.extend({
  location: config.locationType,
  rootURL: config.rootURL,

  router: service(),
  routeHelpers: service(),

  init() {
    this._super(...arguments);
    this.router.on('routeDidChange', () => {
      // tracking with piwik, if the piwik object has been defined
      if (typeof _paq === 'object') {
        _paq.push(['trackPageView']);
      }

      // tracking with google analytics, if the ga method has been defined
      if (typeof ga === 'function') {
        return ga('send', 'pageview', {
          'page': this.get('url'),
          'title': this.get('url')
        });
      }

      // set current route to the onla accordion, which will open
      // it's corresponding accordion element
      var onlaController = this.routeHelpers.controllerFor('onla');
      set(onlaController, 'currentRouteName', this.router.currentRouteName);

    });
  }


});

Excepción:

Exception has occurred: RangeError
RangeError: Maximum call stack size exceeded
    at Registry.isValidFullName (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16657:20)
    at Registry.has (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16448:17)
    at Registry.proto.validateInjections (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16762:25)
    at processInjections (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:15999:28)
    at buildInjections (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16040:7)
    at injectionsFor (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16051:12)
    at FactoryManager.create (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:16116:13)
    at instantiateFactory (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:15979:63)
    at lookup (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:15907:12)
    at Container.lookup (https://n204.crealogix.net:4200/assets/vendor-e2a60dfe5e2603e2bdff789c3cdefd1e.js:15751:14)

Quería reemplazar la función 'didTransition' en mi router.js escuchando el evento 'routeDidChange', porque recibí esta advertencia de desaprobación:

DEPRECATION: Intentaste anular el método "didTransition", que está obsoleto. Inyecte el servicio del enrutador y escuche el evento "routeDidChange". [ID de desaprobación: deprecate-router-events] Consulte https://emberjs.com/deprecations/v3.x#toc_deprecate -router-events para obtener más detalles.

@ursqontis para el registro, puede escuchar los eventos del enrutador desde dentro del enrutador. Solo debería necesitar hacer this.on('routeDidChange') . Este fragmento tiene el ejemplo de trabajo: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Si se pretende que sea la API pública para hacer esto en EmberRouter , ¿podemos documentarlo? cc. @pzuraq @rwjblue @chadhietala? Si no es API pública, estoy feliz de escribir una pequeña RFC para que sea API pública.

Creo que, en general, debería considerarse un error si fallan las inyecciones de servicio. El problema en este caso es que el propio servicio del enrutador obtiene el enrutador: principal inyectado en él.

Lo que está sucediendo aquí es:

La solución aquí es hacer que el servicio del enrutador _no_ busque ansiosamente el enrutador: principal ...

@rwjblue , ¿qué tan difícil es eso? ¡Voy a tener un poco de tiempo en las próximas semanas cuando probablemente podría llegar a esto si el camino está despejado!

Lo siento, me perdí esto en ese momento @chriskrycho. Creo que debería ser bastante sencillo (por ejemplo, "no demasiado difícil") eliminar la autoinyección y solo buscar el servicio del enrutador cuando realmente se activa.

¿Fue útil esta página
0 / 5 - 0 calificaciones