根据我们对不和谐注入路由器的讨论,但您必须调用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时错过了这个。 我认为删除自动注入应该相当简单(例如“不太难”),并且仅在实际启动时才查找路由器服务。
最有用的评论
@ursqontis作为记录,您可以从路由器内部监听路由器事件。 您只需要执行
this.on('routeDidChange')
。 该代码段具有工作示例: https :