Ionic-framework: Ionic V2: لا يوجد مزود لـ NavController! حل؟

تم إنشاؤها على ١٠ ديسمبر ٢٠١٦  ·  15تعليقات  ·  مصدر: ionic-team/ionic-framework

الإصدار الأيوني: (حدد واحدًا بـ "x")
[] 1.x
[x] 2.x

أقوم بإرسال ... (حدد واحدًا بعلامة "x")
[x] تقرير الشوائب
[ ] طلب المواصفات
[] support request => الرجاء عدم إرسال طلبات الدعم هنا ، استخدم إحدى هذه القنوات: https://forum.ionicframework.com/ أو http://ionicworldwide.herokuapp.com/

السلوك الحالي:
فشل حقن NavController في مُنشئ الخدمة مع عدم وجود خطأ في الموفر

سلوك متوقع:
للعمل

خطوات التكاثر:
هذه الفئة تتسبب في خطأ (لا يؤدي إدخال الأقسام الأخرى إلى حدوث أي خطأ)

import {Interceptor, InterceptedRequest, InterceptedResponse} from 'ng2-interceptors';
import {NavController, Platform, AlertController} from "ionic-angular";
import {Injectable, Injector} from "@angular/core";

@Injectable()
export class ServerInterceptorService implements Interceptor {

  constructor(public platform: Platform,
              public alertCtl: AlertController,
              public navCtl: NavController) {
  }

  public interceptBefore(request: InterceptedRequest): InterceptedRequest {
    // Do whatever with request: get info or edit it

    return request;
    /*
     You can return:
     - Request: The modified request
     - Nothing: For convenience: It's just like returning the request
     - <any>(Observable.throw("cancelled")): Cancels the request, interrupting it from the pipeline, and calling back 'interceptAfter' in backwards order of those interceptors that got called up to this point.
     */
  }

  public interceptAfter(response: InterceptedResponse): InterceptedResponse {
    // Do whatever with response: get info or edit it
    console.log("////////////", response)
    return response;
    /*
     You can return:
     - Response: The modified response
     - Nothing: For convenience: It's just like returning the response
     */
  }
}

وتحل الفئة أعلاه محل مزود http في app.module.ts

providers:[
    ServerInterceptorService,
    {
      provide: Http,
      useFactory: interceptorFactory,
      deps: [XHRBackend, RequestOptions, ServerInterceptorService]
    },
...]

يتم حقن التبعيات الأخرى بشكل صحيح.

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

@ m3l7 جرب التالي:

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

ال 15 كومينتر

وفقًا لـ https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/26
يقال

فقط للتناغم مع هذا ، لا يجب أن تحقن ViewController أو NavController في الخدمة.
هذا ليس الغرض المقصود منها.

ثم من فضلك قل لي ، كيف يجب أن نضيف اعتراضات عالمية إلى التطبيق ، والتي ستعمل بناءً على معرفة العرض النشط الذي يراه المستخدم؟

هل يجب أن نبالغ في تعقيد حياتنا من خلال إخبار كل مكون من مكونات العرض بالاستماع إلى خدمة المعترض أو الاشتراك فيها إذا كانت ترسل شيئًا اعتمادًا على منطقها الداخلي حتى يعرف العرض ما إذا كان يجب أن يعود إلى صفحة تسجيل الدخول؟

بالنسبة الى
https://medium.com/coding-snippets/ionic-2-ui-alert-from-a-angular-2-service-221a2e526760#.spxbdpfz1

constructor(private app: IonicApp) {}
let alert = Alert.create({title: 'Error', message: message, buttons: ['OK']});
var nav = this.app.getActiveNav();
nav.present(alert

لا يعمل في rc3 بالنسبة لي.

ربما أفتقد بعض النقاط ولكن ...

لمجرد أن فريق Angular أو غيره يقولون أن _هذا مكون عرض وهذا كائن خدمة_ ، فإن عزلهم تمامًا لمجرد وجود نوع من تثبيت التصنيف لا يساعد. كلهم أشياء يمكن وينبغي أن تكون قادرة على الحصول على مرجع لبعضها البعض عند الحاجة.

علاوة على ذلك ، يعد NavController على مستوى تطبيق مجرد وحدة تحكم عالمية منسقة أكثر من كونها فئة مقترنة لعرض بسيط. لذا ، نظرًا لأن NavController "أساسي جدًا" ، أقترح إعادة التفكير في هذا التصميم أو إضافة خدمة تطبيق مركزية واسعة إلى الوحدة الأساسية Ionic.

هناك حل بسيط للغاية ، داخل app.component.ts الرائع
ViewChild ('carguardNav') navCtrl: NavController
يمكن أن تنتقل إلى مقدمي الخدمات الآخرين مثل

myGlobalService.nav = this.navCtrl

أثناء مرحلة تهيئة النظام الأساسي ، ومن ثم يمكن استرجاعها من الخدمة الأخرى التي تعتمد على MyGlobalService وحقنتها.

أهلا! آسف أن لديك مشاكل هنا. لذلك لا يمكن إدخال NavController في خدمة لأن الخدمة لا تحتوي على NavController. هذا يعني أن حقن التبعية الزاويّة لا يعرف أي NavController سيحصل على مرجع أيضًا مما يتسبب في حدوث خطأ. الشيء المهم الذي يجب تذكره هو أن هذا ليس مركزيًا في NavController الخاص بنا ، إنه خطأ Angular DI القياسي. إذا كنت أفهم حالة الاستخدام الخاصة بك بشكل صحيح ، فيمكنك استخدام بواعث الأحداث للحصول على نفس الوظيفة. نظرًا لأن هذا ليس خطأً من جانبنا ، ولكن ببساطة كيفية عمل Dependency Injection في Angular 2 ، سأغلق هذه المشكلة في الوقت الحالي ، لكنني أوصي بشدة بفتح طلب ميزة لفكرة خدمة navcontroller واسعة التطبيق المركزية أذكر أعلاه. شكرا لاستخدام Ionic!

في الواقع لقد قدمت حلاً آخر لمن يهمه الأمر ، فأنا أستخدم أحداث التطبيق على نطاق واسع لربط العرض ومكونات الخدمة من خلال نمط IoC مما يعني أحداث البث القديمة الجيدة من الخدمات والاشتراك فيها في مكونات العرض.

barocsi هل تمانع في نشر الحل الخاص بك؟ أنا أواجه نفس المشكلة.

اضطر هذا القرف للعمل مع getter و Injector

  constructor(
    protected injector: Injector
  ) {

...

  get navCtrl(): NavController {
    return this.injector.get(NavController);
  }

bobrosoft هل لديك مثال عملي؟ أحصل على "لا يوجد حاقن لـ Navcontroller" مرة أخرى مع التعليمات البرمجية الخاصة بك

@ m3l7 جرب التالي:

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

bobrosoft ، حسنًا ، إنه يعمل .. المشكلة هي أنه من خلال الاتصال مباشرة بـ nav.push (MyComponent) أحصل على حلقة من التبعيات ، لذا فأنا مجبر على استخدام الأحداث التي تم التقاطها بواسطة خدمة "جهاز التوجيه" والتي ستؤدي إلى تشغيل nav.push (على أمل أن يعمل هذا الحل).

سيكون من الرائع أن يكون لديك حلول توجيه أكثر تقدمًا في ionic2 .. أحاول فقط إنشاء معترض 401 أساسي وإعادة توجيه التطبيق إلى صفحة تسجيل الدخول

يا bobrosoft : هذا هو الطريق إلى ذلك!

المنشئ (Inject (Platform) platform،Inject (NavController) navController) {
}

هذا موضح هنا: https://github.com/driftyco/ionic/issues/5543

mpeguero التي لن تعمل إذا تم إنشاء الخدمة (نحن حول الخدمات ، أليس كذلك؟) في مراحل سابقة وهذا تقنيًا قريب من نفس إجابتي الأولى. لقد تحققت من ذلك من قبل.

هذا الحل

  constructor(
    protected app: App,
...
  get navCtrl(): NavController {
    return this.app.getRootNav();
  }

أفضل ولكنه ليس مثاليًا أيضًا.

يوجد حل في المستندات الأيونية. أنه يعمل بشكل جيد.

احصل على Outlook لنظام Android http://aka.ms/ghei36

في يوم الاثنين ، 20 آذار (مارس) 2017 الساعة 4:44 صباحًا -0400 صباحًا ، كتب "فلاديمير تولستيكوف" < [email protected] [email protected] >:

mpeguero https://github.com/mpeguero التي لن تعمل إذا تم إنشاء الخدمة (نحن بخصوص الخدمات ، أليس كذلك؟) في مراحل سابقة وهذا تقنيًا قريب من نفس إجابتي الأولى. لقد تحققت من ذلك من قبل.

هذا الحل

البناء(
التطبيق المحمي: التطبيق ،
...
الحصول على navCtrl (): NavController {
إرجاع this.app.getRootNav () ،
}

أفضل ولكنه ليس مثاليًا أيضًا.

-
أنت تتلقى هذا لأنه تم ذكرك.
قم بالرد على هذه الرسالة الإلكترونية مباشرةً ، أو قم بعرضها على GitHub https://github.com/driftyco/ionic/issues/9581#issuecomment-287701528 ، أو تجاهل الموضوع https://github.com/notifications/unsubscribe-auth/ABvDpy- 6mn19VUnkSbBakAj11hsdEv1zks5rnjxygaJpZM4LJvpd .

فما هو الحل الحالي لهذا الأمر؟ أحاول فتح صفحة تسجيل الخروج إذا جلب المعترض حالة HttpErrorResponse من 401 أو 403 ، لكن لا يمكنني تشغيل ذلك. يبدو مستحيلًا حقًا.

من المنطقي أيضًا أن الخدمة العالمية لن تقوم بحقن وإنشاء مثيل لـ NavController . افترض أنك في الصفحة "أ" ، والتي يستخدم مكونها private navCtrl: NavController ، كما أنها تستخدم global-function-provider .
الآن إذا كان هذا المزود يقوم أيضًا بحقن واستخدام NavController ، فإن استدعاء الموفر من المكون الذي يستخدمه سيؤدي إلى إفساد الأمور.

في رأيي ، كلما أردت استخدام navCtrl ، ببساطة قم بتمريرها كمعامل إلى الوظيفة العامة التي تستخدمها.

شكرا على المشكلة! تم قفل هذه المشكلة لمنع التعليقات غير ذات الصلة بالمشكلة الأصلية. إذا استمرت المشكلة في أحدث إصدار من Ionic ، فيرجى إنشاء مشكلة جديدة والتأكد من ملء النموذج بالكامل.

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