Ember.js: يتكرر حقن خدمة جهاز التوجيه في EmberRouter بلا حدود

تم إنشاؤها على ٢٢ مارس ٢٠١٩  ·  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://github.com/ember-triage/emberjs-17791

ملاحظة: يؤدي إدخال router إلى EmberRouter أيضًا إلى حدوث فواصل.

Bug Has Reproduction Router Bugs

التعليق الأكثر فائدة

ursqontis للتسجيل ، يمكنك الاستماع إلى أحداث جهاز التوجيه من داخل جهاز التوجيه. ما عليك سوى القيام بـ this.on('routeDidChange') . يحتوي هذا المقتطف على مثال عملي: https://github.com/efx/emberjs-17791/commit/8d8dd5afa1b9841742d1127a95689ab98c085632#diff -f3a289058604b2b069d07bb8e2cda60cR8

ال 8 كومينتر

حسب مناقشتنا حول 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. أعتقد أنه يجب أن يكون من السهل جدًا (على سبيل المثال ، "ليس صعبًا جدًا") إزالة الحقن التلقائي ، والبحث فقط عن خدمة جهاز التوجيه عند سحبه فعليًا.

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات