Provider sconosciuto: $ modalProvider <- $ modal error con AngularJS


Risposte:


197

Questo tipo di errore si verifica quando si scrive in una dipendenza per un controller, un servizio e così via e non è stata creata o inclusa tale dipendenza.

In questo caso, $modalnon è un servizio noto. Sembra che tu non sia passato in ui-bootstrap come dipendenza durante l'avvio di angular. angular.module('myModule', ['ui.bootstrap']);Inoltre, assicurati di utilizzare l'ultima versione di ui-bootstrap (0.6.0), solo per sicurezza.

L'errore viene generato nella versione 0.5.0, ma l'aggiornamento alla 0.6.0 rende disponibile il servizio $ modal. Quindi, aggiorna alla versione 0.6.0 e assicurati di richiedere ui.boostrap quando registri il tuo modulo.

Risposta al tuo commento: questo è il modo in cui inietti una dipendenza dal modulo.

<!-- tell Angular what module we are bootstrapping -->
<html ng-app="myApp" ng-controller="myCtrl">

js:

// create the module, pass in modules it depends on
var app = angular.module('myApp', ['ui.bootstrap']);

// $modal service is now available via the ui.bootstrap module we passed in to our module
app.controller('myCtrl', function($scope, $uibModal) {

});

Aggiornare:

Il $modalservizio è stato rinominato $uibModal.

Esempio utilizzando $ uibModal

// create the module, pass in modules it depends on
var app = angular.module('myApp', ['ui.bootstrap']);

// $modal service is now available via the ui.bootstrap module we passed in to our module
app.controller('myCtrl', function($scope, $uibModal) {
    //code here
});

1
Ho aggiunto ui.bootstrap e ricevo ancora lo stesso errore? dobbiamo aggiungere la direttiva sulle cinghie? come ha detto qui stackoverflow.com/questions/18783974/...
Ranadheer Reddy

1
@Ranadheer Il tuo link riguarda il cinturino angolare (è una libreria diversa). Come ho detto, stai usando la versione precedente di ui-bootstrap o non hai aggiunto la dipendenza. Anche l'altra risposta è rilevante, che devi passare il nome durante la minimizzazione, ma non sembra che tu abbia a che fare con la minificazione al momento.
m59

2
Ciao @ m59. Sei rito. Ho incluso la vecchia versione di ui-bootstrap. Ora ho incluso la nuova versione e funziona bene. Grazie mille :-)
Ranadheer Reddy

59
Il $ modal dovrebbe ora leggere $ uibModal. Non sono sicuro in quale versione sia cambiata, ma ho passato troppo tempo a cercare di far funzionare $ modal prima di scoprire che non funziona più ... Lo stesso per $ modalInstance, rendilo $ uibModalInstance
delp

7
È un peccato che lo cambino più e più volte. Prima $ dialog, poi $ modal, ora $ uibModal. Solo malato. Grazie per aver aggiornato la risposta. Mi ha aiutato.
Steven

54

5 anni dopo (questo non sarebbe stato il problema all'epoca) :

Lo spazio dei nomi è cambiato: potresti imbatterti in questo messaggio dopo l'aggiornamento a una versione più recente di bootstrap-ui ; è necessario fare riferimento a $uibModal& $uibModalInstance.


Grazie. Ho usato lo stesso codice per 2 applicazioni ma non funzionava per l'ultima. Questa modifica del nome può interrompere l'applicazione funzionante !!!
Tchaps

2
Grazie !, A partire dalla versione 1.0.0 $ Modal e $ ModalInstance sono stati deprecati,
log delle modifiche

$ modalInstance totalmente NON ha funzionato per me. $ uibModalInstance ha fatto
CommandZ

22

Solo una nota a margine extra per un problema che ho riscontrato anche oggi: ho riscontrato un errore simile "Provider sconosciuto: $ aProvider" quando ho attivato la minimizzazione / uglify del mio codice sorgente.

Come menzionato nel tutorial di Angular docs (paragrafo: "A Note on Minification") devi usare la sintassi dell'array per assicurarti che i riferimenti siano mantenuti correttamente per l'inserimento delle dipendenze:

var PhoneListCtrl = ['$scope', '$http', function($scope, $http) { /* constructor body */ }];

Per l' esempio Bootstrap dell'interfaccia utente angolare che hai menzionato, dovresti sostituire questo:

var ModalInstanceCtrl = function ($scope, $modalInstance, items) { 
   /* ...example code.. */
}

con questa notazione di matrice:

var ModalInstanceCtrl = ['$scope', '$modalInstance', 'items', function ($scope, $modalInstance, items) { 
   /* copy rest of example code here */ 
}];

Con questa modifica il mio codice della finestra modale dell'interfaccia utente angolare miniato era di nuovo funzionante.


Non credo che al momento abbia a che fare con la minificazione, ma vale la pena notare che potrebbe anche causare lo stesso problema.
m59

Dai un'occhiata a github.com/btford/ngmin Puoi eseguirlo prima della minificazione. È quindi possibile continuare a scrivere la forma abbreviata e dipendere da DI in base ai nomi degli argomenti mentre la minificazione funziona ancora poiché ngmin si espande alla versione dell'array.
Pascal

11

La risposta ovvia per l'errore del provider è la dipendenza mancante quando si dichiara un modulo come nel caso dell'aggiunta di ui-bootstrap. L'unica cosa di cui molti di noi non tengono conto sono le modifiche sostanziali durante l'aggiornamento a una nuova versione. Sì, quanto segue dovrebbe funzionare e non generare l'errore del provider:

var app = angular.module('app', ['ui.router', 'ngRoute', 'ui.bootstrap']);
app.factory("$svcMessage", ['$modal', svcMessage]);

Tranne quando stiamo usando una nuova versione di ui-boostrap. Il provider modale ora è definito come:

.provider('$uibModal', function() {
    var $modalProvider = {
      options: {
        animation: true,
        backdrop: true, //can also be false or 'static'
        keyboard: true
      },

Il consiglio qui è che una volta che ci siamo assicurati che le dipendenze siano incluse e otteniamo ancora questo errore, dovremmo controllare quale versione della libreria JS stiamo usando. Potremmo anche fare una rapida ricerca e vedere se quel provider esiste nel file.

In questo caso, il provider modale dovrebbe ora essere il seguente:

app.factory("$svcMessage", ['$uibModal', svcMessage]);

Ancora una nota. Assicurati che la tua versione ui-bootstrap supporti la tua attuale versione di angularjs. In caso contrario, potresti ricevere altri errori come templateProvider.

Per informazioni controllare questo link:

http://www.ozkary.com/2016/01/angularjs-unknown-provider-modalprovider.html

spero che sia d'aiuto.


E il wiki bootstrap dell'interfaccia utente contiene l'elenco di tutte le modifiche ai prefissi.
bjauy

7

dopo aver verificato di includere tutte le dipendenze, ho risolto il problema rinominando $modalin $uibmodale $modalInstancein$uibModalInstance


0
var ModalInstanceCtrl = ['$scope', '$modalInstance',  function ($scope, $modalInstance, items) { 
   /* copy rest of example code here */ 
}];
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.