عينة التعليمات البرمجية:
// app/router.js
const Router = EmberRouter.extend({
location: config.locationType,
rootURL: config.rootURL,
routerService: service('router'),
init() {
this.routerService.on('routeDidChange', () => {});
}
});
الاستنساخ: https://github.com/ember-triage/emberjs-17791
ملاحظة: يؤدي إدخال router
إلى EmberRouter
أيضًا إلى حدوث فواصل.
حسب مناقشتنا حول discord Injecting يعمل جهاز التوجيه ولكن يجب عليك استدعاء 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)
أردت استبدال وظيفة "didTransition" في router.js
خلال الاستماع إلى حدث "routeDidChange" ، لأنني تلقيت تحذير الإيقاف هذا:
الإهمال: لقد حاولت تجاوز طريقة "didTransition" التي تم إيقافها. يرجى إدخال خدمة جهاز التوجيه والاستماع إلى حدث "routeDidChange". [معرّف الإيقاف: depecate-router-events] راجع https://emberjs.com/deprecations/v3.x#toc_deprecate -router-events لمزيد من التفاصيل.
ursqontis للتسجيل ، يمكنك الاستماع إلى أحداث جهاز التوجيه من داخل جهاز التوجيه. ما عليك سوى القيام بـ this.on('routeDidChange')
. يحتوي هذا المقتطف على مثال عملي: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8
إذا كان المقصود أن يكون هذا هو واجهة برمجة التطبيقات العامة للقيام بذلك في EmberRouter
، فهل يمكننا توثيقه؟ سم مكعب. تضمين التغريدة إذا لم تكن واجهة برمجة تطبيقات عامة ، فأنا سعيد بكتابة RFC صغير لجعلها API عامة.
أعتقد أنه يجب اعتباره بشكل عام خطأ إذا فشلت عمليات حقن الخدمة. تكمن المشكلة في هذه الحالة في أن خدمة جهاز التوجيه نفسها تحصل على جهاز توجيه: يتم حقنه فيه.
ما يحدث هنا هو:
الإصلاح هنا هو جعل خدمة الموجه _لا _ تبحث بفارغ الصبر عن جهاز التوجيه: رئيسي ...
rwjblue ، ما مدى صعوبة المصعد؟ سأحظى ببعض الوقت في الأسابيع القليلة القادمة حيث من المحتمل أن أصطدم بهذا إذا كان المسار واضحًا!
آسف فاتني هذا في الوقت chriskrycho. أعتقد أنه يجب أن يكون من السهل جدًا (على سبيل المثال ، "ليس صعبًا جدًا") إزالة الحقن التلقائي ، والبحث فقط عن خدمة جهاز التوجيه عند سحبه فعليًا.
التعليق الأكثر فائدة
ursqontis للتسجيل ، يمكنك الاستماع إلى أحداث جهاز التوجيه من داخل جهاز التوجيه. ما عليك سوى القيام بـ
this.on('routeDidChange')
. يحتوي هذا المقتطف على مثال عملي: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8