2013-10-07 16 views
8

Ho due percorsi che condividono un controller, uno ha bisogno di dati risolti prima del caricamento della vista e l'altro non ha bisogno dei dati risolti.Come si può iniettare manualmente la soluzione per risolvere i dati all'interno di un controller?

Routing esempio segmento:

... 
when('/users', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/view.html', 
    resolve: { 
     resolvedData : ['Accounts', function(Accounts) { 
      return Accounts.get(); 
     }] 
    } 
}). 
when('/users/add', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/add.html' 
}) 
... 

controller esempio:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) { 
     // this works for the first route, but fails for the second route with 
     // unknown "resolvedDataProvider" 
     console.log(resolvedData); 
}]); 

C'è un modo per ottenere il resolvedData nel controller, senza esplicitamente utilizzando il nome determinazione come una dipendenza? Quindi un controllo può essere eseguito?

L'utilizzo dell' $ injector non funziona. Mi piacerebbe fare qualcosa di simile a:

if ($injector.has('resolveData')) { 
    var resolveData = $injector.get('resolveData'); 
} 

Tuttavia questo non funziona anche per il percorso che ha la resolveData set ('/ utenti):

app.controller('UsersCtrl', ['$scope', 'Helper', '$injector', 
    function($scope, Helper, $injector) { 
     // this does not work -> fails with the unknown "resolvedDataProvider" as well 
     $injector.get('resolvedData'); 
}]); 

si può fare in angularjs ? O dovrei semplicemente creare un nuovo controller?

Grazie.

risposta

7

Sembra che ho capito in un altro modo andare. I dati risolti fanno parte di $route. Quindi è possibile accedervi utilizzando:

app.controller('UsersCtrl', ['$scope', '$route', 'Helper', 
    function($scope, $route, Helper) { 

     if ($route.current.locals.resolvedData) { 
      var resolvedData = $route.current.locals.resolvedData; 
     } 
}]); 
+0

In che modo questa soluzione è migliore della mia? Stai essenzialmente facendo la stessa identica cosa, tranne usare un oggetto sepolto nel servizio di route per completarlo. La mia soluzione consente l'uniformità del router e il controller deve ancora gestire la situazione. – Fourth

+3

@Fourth - Non credo che l'aggiunta di una risoluzione non utilizzata che ritorna indefinita alla rotta sia un'opzione migliore, diciamo solo che la mia soluzione si adatta meglio alle mie esigenze ... Ho inversamente votato la tua risposta, ma non credo che il tuo downvote il mio è giustificato. –

+1

Non si utilizzano le funzioni angolari nel modo previsto. Sebbene tu abbia sicuramente trovato una risposta "funzionante", non usa le funzionalità nel modo previsto. Le soluzioni di instradamento sono il modo di iniettare componenti nel controller. Tali componenti possono, legittimamente, essere indefiniti se la risoluzione non ha senso per quella rotta. Ti ho downvoted per scoraggiare gli altri dall'usare questa soluzione, che è giustificata. – Fourth

5

Se l'altro percorso non ne ha bisogno, basta iniettare definito su tale rotta:

router:

when('/users', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/view.html', 
    resolve: { 
     resolvedData : ['Accounts', function(Accounts) { 
      return Accounts.get(); 
     }] 
    } 
}). 
when('/users/add', { 
    controller: 'UsersCtrl', 
    templateUrl: '/partials/users/add.html', 
    resolve: { 
     resolvedData: function() { 
      return undefined; 
     } 
    } 
}) 

regolatore:

app.controller('UsersCtrl', ['$scope', 'Helper', 'resolvedData', 
    function($scope, Helper, resolvedData) { 
     if(resolvedData){ 
      //set some scope stuff for it 
     } else { 
     //do what you do when there is no resolvedData 
     } 
}]); 
Problemi correlati