2016-05-04 21 views
9

Ho una classe controller ModalCtrl e voglio creare una classe figlio ModalCtrlChild extends ModalCtrl. Il problema è quando provo a farlo ottengo un errore sconosciuto fornitore in uno dei moduli iniettati in ModalCtrl.Iniezione moduli nel controller esteso (ES6) causa Errore provider sconosciuto

Ho usato il generatore this per costruire il progetto e utilizza NgInject dietro le quinte per iniettare le dipendenze, ho il sospetto che ci sia qualcosa di divertente lì.

ModalCtrl:

export default class ModalCtrl { 
    static get UID(){ 
    return "ModalCtrl" 
    } 
    ... // all my ModalCtrl methods here 

/* @ngInject */ 
    constructor(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService) { 
    "ngInject"; 
    ... // ModalCtrl constructor logic initing variables 
    } 
} 

ModalCtrlChild:

import ModalCtrl from '../../preoModal.controller'; 

export default class ModalCtrlChild extends ModalCtrl{ 
    static get UID(){ 
    return "modalCtrlChild" 
    } 

    /* @ngInject */ 
    constructor() { 
    // "ngInject"; 
    console.log("in super constructor"); 
    super(); 
    } 
} 

Errore:

Error: [$injector:modulerr] Failed to instantiate module function ModalCtrlChild() due to: 
Error: [$injector:unpr] Unknown provider: ngDialog 
http://errors.angularjs.org/1.5.3/$injector/unpr?p0=ngDialog 

E ngDialog è sicuramente importata e di lavoro. Se cancelli extends ModalCtrl da ModalCtrlChild non ricevo errori e il mio codice funziona bene, ma non sono in grado di ottenere l'ereditarietà di cui ho bisogno. Qualche idea apprezzata.

EDIT

avevo cercato la risposta di eenagy prima di inviare la domanda, che non funziona o, come il problema sembra essere nei inietta classe bambino, non in inietta classe del genitore.

sourdoughdetzel, provato il suo suggerimento:

  1. annotazione Rimosso e le dipendenze da ModalCtrlChild
  2. annotazione Rimosso e dipendenze da ModalCtrl ma li lasciate in figlio

Got esattamente lo stesso errore:

Error: [$injector:modulerr] Failed to instantiate module function PreoModalController_Form() due to: 
Error: [$injector:unpr] Unknown provider: ngDialog 

Ho il sospetto che questo deve fare con il modo in cui Babel sta costruendo la classe estesa e non sta permettendo a ngInject di fare il suo lavoro. Sto cercando di trovare un modo per fare iniezioni manuali qui, che dovrebbe risolvere il problema e dimostrare che questo è il problema in quanto non ne so abbastanza su come il lavoro di babel per risolvere questo problema.

+0

_ "ngDialog è DEFINITAMENTE importato e funzionante" _ Non importa. La domanda è se è disponibile come servizio nel modulo del controllore. Inoltre se il costruttore di 'ModalCtrl' si aspetta degli argomenti piuttosto che passare quegli argomenti quando si chiama' super' nel costruttore di 'ModalCtrlChild'. Il messaggio di errore sembra strano btw. Sembra che tu provi ad istanziare il tuo controller come un modulo. Come appare quel codice? – zeroflagL

+0

@ caiocpricci2 hai risolto questo? – eenagy

+0

Ho suonato un po 'di più e funziona correttamente per me quando iniettando ng-dialog ... – eenagy

risposta

1

La mia ipotesi è che ngInject non stia facendo quello che si suppone stia facendo dietro le quinte quando si chiama "super()" da un costruttore di sottoclasse. Non stavo vedendo molto su ngInject durante la ricerca in giro, ma potrebbe essere in cortocircuito a causa della chiamata manuale al costruttore che sta accadendo.

Se si prendono le dipendenze nel controller ModalCtrlChild e si decommenta la stringa "ngInject", quindi le si passa alla chiamata super(), funziona come previsto?

+0

Grazie per il suggerimento ma ho ottenuto lo stesso errore. Mi sembra che Babel stia facendo qualcosa di inaspettato durante la compilazione del codice e non tenendo conto delle annotazioni durante l'estensione della classe. – caiocpricci2

1

Il messaggio di errore indica in realtà ciò che manca.

Unknown provider: ngDialog 

È necessario dichiarare le dipendenze anche nella sottoclasse.

Così, invece di questo

import ModalCtrl from '../../preoModal.controller'; 

export default class ModalCtrlChild extends ModalCtrl{ 
    static get UID(){ 
    return "modalCtrlChild" 
    } 

    /* @ngInject */ 
    constructor() { 
    // "ngInject"; 
    console.log("in super constructor"); 
    super(); 
    } 
} 

è necessario passare i parametri.

import ModalCtrl from '../../preoModal.controller'; 

export default class ModalCtrlChild extends ModalCtrl{ 
    static get UID(){ 
    return "modalCtrlChild" 
    } 

    /* @ngInject */ 
    constructor(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService) { 
    // "ngInject"; 
    console.log("in super constructor"); 
    super(ngDialog, PreoModalType, OutletService, $q, $timeout, VenueService); 
    } 
} 

Non c'è modo che ngInject saprebbe che sono necessari dipendenze. Come dovrebbe saperlo? Nel mondo reale potrebbero esserci dozzine di sottoclassi di ngDialog che corrisponde al contratto e passabile come parametro. È necessario specificare per poterlo trasmettere.

Ad esempio, immagina di avere una sottoclasse di ngDialog chiamata ngPopupDialog.

E la sottoclasse di esempio. È possibile utilizzare quanto segue al posto di ngDialog e corrispondere al super.

import ModalCtrl from '../../preoModal.controller'; 

export default class ModalCtrlChild extends ModalCtrl{ 
    static get UID(){ 
    return "modalCtrlChild" 
    } 

    /* @ngInject */ 
    constructor(ngPopupDialog, PreoModalType, OutletService, $q, $timeout, VenueService) { 
    // "ngInject"; 
    console.log("in super constructor"); 
    super(ngPopupDialog, PreoModalType, OutletService, $q, $timeout, VenueService); 
    } 
} 
+0

"È necessario passare i parametri in". Questa è stata la prima cosa che ho provato prima di fare la domanda qui, mi dà lo stesso errore. "Come dovrebbe saperlo? Nel mondo reale ci potrebbero essere dozzine di sottoclassi di ngDialog che corrispondono al contratto" Non capisco come questo sia rilevante per il contesto di questa domanda. – caiocpricci2