2013-02-13 18 views
51

Ho due percorsi con risoluzione. Va in questo modo:AngularJS, resolver e provider sconosciuto

.when('/foos', { 
templateUrl: 'views/foos.html', 
controller: 'FoosCtrl', 
resolve: { 
    foo_list: ['$q', '$route', '$timeout', '$location', 'Foos', function($q, $route, $timeout, $location, Foos) { 
     // postpone the execution 
     var deferred_foo = $q.defer() 

     Foos.getFoos({token:session_uid}, successCb) 

     function successCb(list) { 
      if(list['status'] === 200) { 
       deferred_foo.resolve(list) 
      } 
      else { 
       alert('Crashcrashcrash') 
       deferred_foo.reject("Something just wasn't right") 
       //$location.path('maintenance') 
      } 
     } 
     return deferred_foo.promise 
     }] 
    } 
}) 
.when('/r/:type/:bar_id', { 
    templateUrl: 'views/bar.html', 
    controller: 'BarsCtrl', 
    resolve: { 
     bar: ['$q', '$route', '$timeout', '$location', 'Bars', function($q, $route, $timeout, $location, Bars) { 
      // postpone the execution 
      var deferred = $q.defer() 

      Bars.getBar({type: bar_type}, successCb)  

      function successCb(result) { 
       if(result['status'] === 200) { 
        deferred.resolve(result)  
       } 
       else { 
        alert('Crashcrashcrash') 
        deferred.reject("Something just wasn't right") 
        $location.path('foos') 
       } 

       return deferred.promise 
       }] 
      } 
     }) 

allora ho due controller a lavorare in questo modo:

App.controller('FoosCtrl', ['$scope', '$location', 'Foos', 'foo_list', function($scope, $location, Foos, foo_list) {...} 

App.controller('BarsCtrl', ['$scope', '$routeParams', '$location', 'Bars', 'bar', 'sharedService', function($scope, $routeParams, $location, Bars, bar, sharedService) {...} 

Qualcuno potrebbe spiegare perché le opere Bar ma Foo mi dà Error: Unknown provider: foo_listProvider <- foo_list? Ho provato a sostituire foo_list con un nome diverso nel caso in cui CamelCasing abbia fatto qualcosa, ma non ha aiutato.

+0

Sei sicuro opere Bar? Probabilmente non ottieni alcun errore su Bar perché Foo sta fallendo e Bar non viene nemmeno creato/definito. Hai provato a cambiare l'ordine di init? – bmleite

+0

Sì. Bar funziona perfettamente - questo è il motivo per cui sono così frustrato e confuso su questo. Ho fatto parte della sezione Bar dell'app poche settimane fa e ora volevo applicare la risoluzione anche a Foo. – jimmy

+0

Se si accede a 'bar' all'interno di' BarsCtrl' cosa si ottiene? Contiene qualcosa o è solo * non definito *? – bmleite

risposta

2

foo_list < - il file js per questo viene caricato nella pagina html in un tag script? potrebbe semplicemente accadere che quando hai dimenticato di includere factory/service/controller e in realtà abbia dimenticato di includerlo in un tag script nella pagina index/app html (o richiedere shim)

Okay ho appena visto il tuo commento e estendendo qui la risposta perché è più facile farlo qui.

codice in cui si dichiara il controllore deve leggere come

App.controller('FoosCtrl', 
    ['$scope', '$location', 'Foos', /* comment out foo_list here*/ 
    function($scope, $location, Foos, foo_list /* this remains */) { 
    ... 
} 

quando il percorso è sempre cambiato le cose di cui parli a 'risolvere' otterrebbe risolto con ui-router. Ma è il luogo in cui stai dichiarando il tuo FoosCtrl che in realtà non hai un provider da risolvere.

Fare questo a prova ho avuto un caso simile come questo la scorsa settimana.

+0

'foo_list' dovrebbe essere promesso e risolto per nome a causa della proprietà' resolve' del percorso. –

+0

Ciò causerà l'errore del provider sconosciuto di andare via, ma ora foo_list non è associato a foo_list in risoluzione ... è solo una variabile indefinita. – Kriil

172

Quindi, questa domanda era sorprendentemente simile alla mia, che ho appena scoperto con l'aiuto dei ragazzi del canale IRC Angolare ... sei, per caso, impostato il tuo controller tramite ng-controller? Ho avuto:

<div ng-controller="myCtrl"> 

... quando dovrebbe essere stato rimosso:

<div> 

... perché stavo installando il controller nella determinazione sul router. Questo è quello che stavo facendo e stava causando questo problema. Si può vedere di più qui:

https://stackoverflow.com/a/18305423/1306982

+2

Hai inchiodato il problema per me. – rainkinz

+1

Così ragionevole in retrospettiva. Grazie! –

+1

Sei un risparmiatore di vita ..! grazie .. –

0

Proprio come un testa a testa, ho appena avuto un problema simile che è stato causato aggiungendo la volontà-variabili come una dipendenza al controllore pur non avendo istituito il funciton risposta nel $stateProvider.state() ancora.

aggiungendo la funzione di determinazione fissata la dipendenza mancante
(io ancora non riesce quasi mai perché - sarei felice se qualcuno potesse condividere la sua conoscenza nei commenti)

+0

qual è la funzione di risposta nello stato? Puoi chiarire con un esempio? – TGS

+0

Sicuro. Non la funzione di risposta, ma la funzione di risoluzione. Succede quando si richiede una variabile sul controller '.controller ('fooCtrl', function (someRequire) {...});' mentre non si ha una risoluzione su che richiede definita '.when ('...', { resolve: {notDefineSomeRequire: [...]}}) '. Vedere [questo violino] (https://jsfiddle.net/Aides/bfqm7q5d/) per la dimostrazione e confrontarlo con [questo violino fisso] (https://jsfiddle.net/Aides/2gm7ykxt/) (notare la risoluta aggiunta su 'fooState') – Aides

+0

Strano, ho la funzione di risoluzione e restituisce una promessa. Nel mio controller, i dati vengono forniti correttamente, ma viene generato il provider di errore sconosciuto per il mio parametro named. IE, nel tuo violino, avrei un errore foo_listProvider. È bizzarro. Vedo che i dati vengono inviati al controller quando inserisco un punto di interruzione. Il codice viene eseguito e, una volta lasciato il controller, l'errore viene generato da Angular. – TGS

Problemi correlati