Ember.js: 将路由器服务注入EmberRouter无限循环

创建于 2019-03-22  ·  8评论  ·  资料来源: emberjs/ember.js

代码示例:

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

  routerService: service('router'),

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

复制: https :

PS将router注入到EmberRouter也会中断。

Bug Has Reproduction Router Bugs

最有用的评论

@ursqontis作为记录,您可以从路由器内部监听路由器事件。 您只需要执行this.on('routeDidChange') 。 该代码段具有工作示例: https :

所有8条评论

根据我们对不和谐注入路由器的讨论,但您必须调用this._super(...arguments);https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8
我的错误; 将此与确保可以从路由器实例注册路由事件混为一谈。

@efx该代码段未注入路由器服务,我相信情况是不同的!

我还可以在Ember 3.8上确认这种行为

码:

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

    });
  }


});

例外:

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)

我想通过监听'routeDidChange'事件来替换router.js的'didTransition'函数,因为我收到了以下弃用警告:

不推荐使用:您试图覆盖不推荐使用的“ didTransition”方法。 请注入路由器服务并收听“ routeDidChange”事件。 [deprecation id:deprecate-router-events]有关更多详细信息,请参见https://emberjs.com/deprecations/v3.x#toc_deprecate -router-events。

@ursqontis作为记录,您可以从路由器内部监听路由器事件。 您只需要执行this.on('routeDidChange') 。 该代码段具有工作示例: https :

如果打算在EmberRouter中将其用作执行此操作的公共API,我们可以对其进行记录吗? 抄送 @pzuraq @rwjblue @chadhietala? 如果不是公共API,我很乐意编写一个小的RFC使其成为公共API。

我认为,如果服务注入失败,通常应该将其视为错误。 在这种情况下,问题在于路由器服务本身已将router:main注入其中。

这里发生的是:

解决方法是使路由器服务_not_急切地查找路由器:main ...

@rwjblue ,这有多难? 在接下来的几周中,我将有一点时间,如果路很清楚,我可能会实现这一目标!

抱歉,我在@chriskrycho时错过了这个。 我认为删除自动注入应该相当简单(例如“不太难”),并且仅在实际启动时才查找路由器服务。

此页面是否有帮助?
0 / 5 - 0 等级