Ionic-framework: Ionic V2: Tidak ada penyedia untuk NavController! Larutan?

Dibuat pada 10 Des 2016  ·  15Komentar  ·  Sumber: ionic-team/ionic-framework

Versi ionik: (centang satu dengan "x")
[ ] 1.x
[x ] 2.x

Saya mengirimkan ... (centang satu dengan "x")
[x] laporan bug
[ ] permintaan fitur
[ ] permintaan dukungan => Tolong jangan kirimkan permintaan dukungan di sini, gunakan salah satu saluran ini: https://forum.ionicframework.com/ atau http://ionicworldwide.herokuapp.com/

Perilaku saat ini:
Menyuntikkan NavController di konstruktor layanan gagal tanpa kesalahan penyedia

Perilaku yang diharapkan:
bekerja

Langkah-langkah untuk mereproduksi:
Kelas ini melempar kesalahan (injeksi dep. lain tidak menimbulkan kesalahan apa pun)

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
     */
  }
}

dan kelas di atas menggantikan penyedia http di app.module.ts

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

Ketergantungan lain disuntikkan dengan benar.

Komentar yang paling membantu

@m3l7 coba selanjutnya:

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

Semua 15 komentar

Menurut https://forum.ionicframework.com/t/why-cant-i-import-navcontroller-and-viewcontroller-into-service-or-app/40999/26
itu dikatakan

Hanya untuk mengikuti ini, Anda tidak boleh menyuntikkan ViewController atau NavController ke dalam Layanan.
Ini bukan tujuan yang mereka maksudkan.

Lalu tolong beri tahu saya, bagaimana kami harus menambahkan pencegat global ke aplikasi, yang akan bertindak tergantung pada mengetahui tampilan aktif apa yang dilihat pengguna?

Haruskah kita memperumit hidup kita dengan memberi tahu setiap komponen tampilan untuk mendengarkan atau berlangganan layanan pencegat jika memancarkan sesuatu tergantung pada logika internalnya sehingga tampilan akan tahu apakah itu harus kembali ke halaman login?

berdasarkan
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

tidak bekerja di rc3 untuk saya.

Saya mungkin kehilangan beberapa poin tapi ...

Hanya karena tim Angular atau orang lain mengatakan bahwa _ini adalah komponen tampilan dan itu adalah objek layanan_, mengisolasi mereka sepenuhnya hanya karena semacam fiksasi kategorisasi tidak membantu. Semuanya adalah objek yang bisa dan harus bisa saling referensi saat dibutuhkan.

Selain itu, NavController pada level aplikasi abstrak lebih merupakan pengontrol global yang mengatur daripada kelas gabungan tampilan sederhana. Jadi karena NavController adalah "sangat inti", saya akan menyarankan untuk memikirkan kembali desain ini atau menambahkan layanan luas aplikasi terpusat ke modul inti Ionic.

Ada solusi kotor yang sangat sederhana, dalam app.component.ts Anda yang luar biasa
@ViewChild('carguardNav') navCtrl: NavController
dapat diteruskan ke penyedia layanan lain seperti

myGlobalService.nav = this.navCtrl

selama fase inisialisasi platform, dan kemudian dapat diambil dari layanan Anda yang lain yang bergantung pada dan telah menyuntikkan MyGlobalService.

Halo! Maaf bahwa Anda mengalami masalah di sini. Jadi NavController tidak dapat disuntikkan ke dalam suatu layanan karena suatu layanan tidak memiliki NavController. Ini berarti bahwa injeksi ketergantungan Angular tidak tahu NavController mana yang mendapatkan referensi juga menyebabkan kesalahan. Hal penting untuk diingat adalah bahwa ini bukan pusat NavController kami, ini adalah kesalahan DI sudut standar. Jika saya memahami kasus penggunaan Anda dengan benar, Anda dapat menggunakan penghasil acara untuk mendapatkan fungsi yang sama. Karena ini bukan kesalahan di pihak kami, tetapi hanya bagaimana Injeksi Ketergantungan bekerja di Angular 2 Saya akan menutup masalah ini untuk saat ini, tetapi saya sangat menyarankan Anda membuka permintaan fitur untuk ide layanan navcontroller lebar aplikasi terpusat yang Anda sebutkan di atas. Terima kasih telah menggunakan Ionic!

Sebenarnya saya telah membuat solusi lain untuk siapa yang mungkin berkepentingan, saya menggunakan acara di seluruh aplikasi untuk menghubungkan komponen tampilan dan layanan melalui pola IoC yang berarti acara penyiaran lama yang bagus dari layanan dan berlangganan mereka dalam komponen tampilan.

@barocsi Apakah Anda keberatan memposting solusi Anda? Saya mengalami masalah yang sama.

Memaksa omong kosong itu untuk bekerja dengan pengambil dan Injector

  constructor(
    protected injector: Injector
  ) {

...

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

@bobrosoft apakah Anda memiliki contoh kerja? Saya mendapatkan "tidak ada injektor untuk Navcontroller" lagi dengan kode Anda

@m3l7 coba selanjutnya:

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

@bobrosoft ok, itu berfungsi .. masalahnya adalah dengan memanggil langsung nav.push(MyComponent) saya mendapatkan loop dependensi, jadi saya terpaksa menggunakan acara yang ditangkap oleh layanan "router" yang akan memicu nav.push (berharap solusi ini akan berhasil).

akan sangat bagus jika memiliki solusi perutean yang lebih canggih di ionic2.. Saya hanya mencoba membuat pencegat 401 dasar dan mengarahkan ulang aplikasi ke halaman login

Hei @bobrosoft : Ini caranya!

konstruktor(@Inject(Platform), @Inject(NavController) navController) {
}

Ini dijelaskan di sini: https://github.com/driftyco/ionic/issues/5543

@mpeguero itu tidak akan berfungsi jika layanan (kami tentang layanan, kan?) dipakai pada tahap sebelumnya dan itu secara teknis hampir sama dengan jawaban pertama saya. Saya memeriksa itu sebelumnya.

Solusi itu

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

lebih baik tetapi tidak ideal juga.

Dalam dokumen Ionic ada solusinya. Ini bekerja dengan baik.

Dapatkan Outlook untuk Android http://aka.ms/ghei36

Pada Senin, 20 Maret 2017 pukul 04:44 -0400, "Vladimir Tolstikov" < [email protected] [email protected] > menulis:

@mpeguero https://github.com/mpeguero itu tidak akan berfungsi jika layanan (kami tentang layanan, kan?) dipakai pada tahap sebelumnya dan itu secara teknis hampir sama dengan jawaban pertama saya. Saya memeriksa itu sebelumnya.

Solusi itu

konstruktor (
aplikasi yang dilindungi: Aplikasi,
...
dapatkan navCtrl(): NavController {
kembalikan this.app.getRootNav();
}

lebih baik tetapi tidak ideal juga.


Anda menerima ini karena Anda disebutkan.
Balas email ini secara langsung, lihat di GitHub https://github.com/driftyco/ionic/issues/9581#issuecomment-287701528 , atau nonaktifkan utas https://github.com/notifications/unsubscribe-auth/ABvDpy- 6mn19VUnkSbBakAj11hsdEv1zks5rnjxygaJpZM4LJvpd .

jadi apa solusi saat ini tentang masalah ini? Saya mencoba membuka halaman Logout jika Interceptor mengambil status HttpErrorResponse 401 atau 403, tetapi tidak dapat membuatnya berfungsi. Sepertinya tidak mungkin, sungguh.

Masuk akal juga bahwa layanan global tidak akan menyuntikkan dan membuat instance NavController . Asumsikan Anda berada di halaman A, yang komponennya menggunakan private navCtrl: NavController , dan juga menggunakan global-function-provider .
Sekarang jika penyedia ini juga menyuntikkan dan menggunakan NavController miliknya sendiri, memanggil penyedia dari komponen yang menggunakannya akan mengacaukan segalanya.

Menurut pendapat saya, setiap kali Anda ingin menggunakan Halaman itu navCtrl , cukup berikan sebagai parameter ke fungsi global yang Anda gunakan.

Terima kasih untuk masalah ini! Masalah ini sedang dikunci untuk mencegah komentar yang tidak relevan dengan masalah asli. Jika ini masih menjadi masalah dengan versi terbaru Ionic, harap buat masalah baru dan pastikan template terisi penuh.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat