Ember.js: A injeção do serviço de roteador no EmberRouter recorre infinitamente

Criado em 22 mar. 2019  ·  8Comentários  ·  Fonte: emberjs/ember.js

Amostra de código:

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

  routerService: service('router'),

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

Reprodução: https://github.com/ember-triage/emberjs-17791

PS Injetar router em EmberRouter também quebra.

Bug Has Reproduction Router Bugs

Comentários muito úteis

@ursqontis para registro, você pode ouvir os eventos do roteador de dentro do roteador. Você só precisa fazer this.on('routeDidChange') . Este snippet tem o exemplo funcional: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Todos 8 comentários

De acordo com nossa discussão sobre discord Injetar o roteador funciona, mas você deve invocar this._super(...arguments);https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8
Meu erro; confundiu isso com a garantia de que você pode registrar eventos de roteamento da instância do roteador.

@efx aquele trecho de código não está injetando o serviço do roteador, acredito que seja uma situação diferente!

Também posso confirmar este comportamento, no 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);

    });
  }


});

Exceção:

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)

Eu queria substituir a função 'didTransition' em meu router.js ouvindo o evento 'routeDidChange', porque recebi este aviso de suspensão de uso:

REMOÇÃO: você tentou substituir o método "didTransition", que está obsoleto. Injete o serviço do roteador e ouça o evento "routeDidChange". [id de deprecação: deprecate-router-events] Veja https://emberjs.com/deprecations/v3.x#toc_deprecate -router-events para mais detalhes.

@ursqontis para registro, você pode ouvir os eventos do roteador de dentro do roteador. Você só precisa fazer this.on('routeDidChange') . Este snippet tem o exemplo funcional: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Se esta for a API pública para fazer isso em EmberRouter , podemos documentar? cc. @pzuraq @rwjblue @chadhietala? Se não for uma API pública, estou feliz em escrever um pequeno RFC para torná- la uma API pública.

Acho que geralmente deve ser considerado um bug se as injeções de serviço falharem. O problema, nesse caso, é que o próprio serviço do roteador recebe o roteador: principal injetado nele.

O que está acontecendo aqui é:

A correção aqui é fazer com que o serviço do roteador _não_ procure avidamente o roteador: principal ...

@rwjblue , quão difícil é esse levantamento? Terei um tempinho nas próximas semanas, quando provavelmente poderei acertar isso se o caminho estiver livre!

Desculpe, eu perdi isso na hora @chriskrycho. Acho que deve ser bastante simples (por exemplo, "não muito difícil") para remover a injeção automática e apenas procurar o serviço do roteador quando realmente puxado.

Esta página foi útil?
0 / 5 - 0 avaliações