Ember.js: Menyuntikkan layanan router ke EmberRouter berulang tanpa batas

Dibuat pada 22 Mar 2019  ·  8Komentar  ·  Sumber: emberjs/ember.js

Contoh kode:

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

  routerService: service('router'),

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

Reproduksi: https://github.com/ember-triage/emberjs-17791

PS Menyuntikkan router menjadi EmberRouter juga rusak.

Bug Has Reproduction Router Bugs

Komentar yang paling membantu

@ursqontis sebagai catatan, Anda dapat mendengarkan peristiwa router dari dalam router. Anda hanya perlu melakukan this.on('routeDidChange') . Cuplikan ini memiliki contoh yang berfungsi: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Semua 8 komentar

Per diskusi kita tentang perselisihan Menyuntikkan router berfungsi tetapi Anda harus meminta this._super(...arguments);https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8
Kesalahan saya; menggabungkan ini dengan memastikan Anda dapat mendaftarkan peristiwa perutean dari instance router.

@efx potongan kode itu tidak menyuntikkan layanan router, saya yakin itu adalah situasi yang berbeda!

Saya juga dapat mengkonfirmasi perilaku ini, di Ember 3.8

Kode:

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);

    });
  }


});

Pengecualian:

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)

Saya ingin mengganti fungsi 'didTransition' di router.js dengan mendengarkan acara 'routeDidChange', karena saya mendapat peringatan deprecation ini:

PENCEGAHAN: Anda mencoba untuk mengganti metode "didTransition" yang sudah tidak digunakan lagi. Harap masukkan layanan router dan dengarkan peristiwa "routeDidChange". [deprecation id: deprecate-router-events] Lihat https://emberjs.com/deprecations/v3.x#toc_deprecate -router-events untuk mengetahui detail selengkapnya.

@ursqontis sebagai catatan, Anda dapat mendengarkan peristiwa router dari dalam router. Anda hanya perlu melakukan this.on('routeDidChange') . Cuplikan ini memiliki contoh yang berfungsi: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

Jika ini dimaksudkan untuk menjadi API publik untuk melakukan ini di EmberRouter , dapatkah kita mendokumentasikannya? cc. @pzuraq @rwjblue @chadhietala? Jika ini bukan API publik, dengan senang hati saya menulis RFC kecil untuk menjadikannya API publik.

Saya pikir itu umumnya harus dianggap bug jika injeksi layanan gagal. Masalah dalam kasus ini adalah bahwa layanan router itu sendiri mendapatkan router: main yang dimasukkan ke dalamnya.

Yang terjadi disini adalah:

  • sebuah injeksi sehingga layanan: router menerima router: main saat dipakai
  • router: main mendongak
  • router: main mencari layanan: router pada instantiation (ini dilakukan di debug build untuk semua injeksi layanan, sehingga kami dapat memberikan kesalahan yang baik ketika layanan yang direferensikan tidak tersedia dalam sistem. Berbeda dengan hanya membuat kesalahan _ jika_ terjadi untuk mencoba menggunakan layanan)
  • untuk membuat instance layanan: router wadah mencoba membuat router: main (untuk memenuhi injeksi itu)
  • lingkaran

Perbaikan di sini adalah membuat layanan router _not_ dengan bersemangat mencari router: main ...

@rwjblue , seberapa keras lift itu? Saya akan memiliki sedikit waktu dalam beberapa minggu ke depan ketika saya mungkin bisa mencapai ini jika jalurnya jelas!

Maaf saya melewatkan ini saat itu @chriskrycho. Saya pikir seharusnya cukup mudah (misalnya "tidak terlalu sulit") untuk menghapus injeksi otomatis, dan hanya mencari layanan router ketika benar-benar diaktifkan.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat