Ionic-framework: Ionic V2: нет провайдера для NavController! Решение?

Созданный на 10 дек. 2016  ·  15Комментарии  ·  Источник: ionic-team/ionic-framework

Ионная версия: (отметьте один с "x")
[] 1.x
[x] 2.x

Я отправляю ... (отметьте "x")
[x] отчет об ошибке
[] запрос функции
[] запрос поддержки => Пожалуйста, не отправляйте запросы на поддержку здесь, используйте один из этих каналов: 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 в Service.
Это не их прямое предназначение.

Тогда скажите мне, как нам добавить в приложение глобальные перехватчики, которые будут действовать в зависимости от того, какой активный вид видит пользователь?

Должны ли мы чрезмерно усложнять нашу жизнь, говоря каждому компоненту представления, чтобы он слушал или подписывался на службу перехватчика, если он что-то излучает, в зависимости от своей внутренней логики, чтобы представление знало, следует ли ему вернуться на страницу входа?

в соответствии с
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. Это означает, что инъекция зависимостей Angular не знает, какой NavController получить ссылку, что тоже вызывает ошибку. Важно помнить, что это не главное для нашего NavController, это стандартная ошибка Angular DI. Если я правильно понимаю ваш вариант использования, вы можете использовать эмиттеры событий, чтобы получить ту же функциональность. Поскольку это не ошибка с нашей стороны, а просто то, как работает внедрение зависимостей в Angular 2, я сейчас закрою эту проблему, но я настоятельно рекомендую вам открыть запрос функции для идеи централизованной службы navcontroller для всего приложения, которую вы упомянуть выше. Спасибо за использование Ionic!

На самом деле я сделал другое решение, которое может заинтересовать, я использую события приложения для подключения компонентов представления и службы через шаблон IoC, что означает старые добрые широковещательные события из служб и подписку на них в компонентах представления.

@barocsi Не могли бы вы опубликовать свое решение? Я столкнулся с той же проблемой.

Заставил это дерьмо работать с геттером и инжектором

  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) я получаю цикл зависимостей, поэтому я вынужден использовать события, перехваченные службой "router", которая запускает nav.push (надеясь, что это решение сработает).

было бы здорово иметь более продвинутые решения для маршрутизации в ionic2 .. Я просто пытаюсь сделать базовый перехватчик 401 и перенаправить приложение на страницу входа

Привет, @bobrosoft : это путь к этому!

конструктор (платформа @Inject (Platform), @Inject (NavController) navController) {
}

Это объясняется здесь: https://github.com/driftyco/ionic/issues/5543

@mpeguero , который не будет работать, если сервис (мы о сервисах, верно?) был создан на более ранних этапах, и это технически близко к моему первому ответу. Я проверял это раньше.

Это решение

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

лучше, но тоже не идеально.

В документации Ionic есть решение. Работает нормально.

Получите 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 . Предположим, вы находитесь на странице A, компонент которой использует private navCtrl: NavController , а также global-function-provider .
Теперь, если этот провайдер также вводит и использует свой собственный NavController , вызов поставщика из компонента, который его использует, испортит ситуацию.

На мой взгляд, всякий раз, когда вы хотите использовать navCtrl этой страницы, просто передайте его как параметр глобальной функции, которую вы используете.

Спасибо за вопрос! Эта проблема заблокирована, чтобы предотвратить комментарии, не относящиеся к исходной проблеме. Если это все еще проблема с последней версией Ionic, создайте новую проблему и убедитесь, что шаблон полностью заполнен.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги