2014-12-17 23 views
31

Ho più percorsi che invocano lo stesso controller e vorrei passare variabili diverse ad esso.

// Example 
$routeProvider. 
    when('/a', { 
    templateUrl: 'test.html', 
    controller: 'MyController' // should get passed 'exampleA' 
    }). 
    when('/b', { 
    templateUrl: 'test.html', 
    controller: 'MyController' // should get passed 'exampleB' 
}); 

So che avrei potuto utilizzare l'oggetto "determinazione":

$routeProvider. 
    when('/a', { 
    templateUrl: 'test.html', 
    controller: 'MyController', 
    resolve: {test: function() { return true; }} 
}); 

per passare un valore come dipendenza:

app.controller('MyController', ['$scope', 'test', function ($scope, test) { 
    console.log(test); // true 
} 

Il mio problema con questo approccio è che la mia app si blocca se manca l'oggetto di risoluzione su altre rotte e vorrei passare i parametri facoltativi.

Esiste un modo per trasmettere parametri specifici al controller (dal fornitore del percorso)?


Grazie

risposta

48

Routing :

$routeProvider. 
    when('/a', { 
    templateUrl: 'test.html', 
    controller: 'MyController', 
    paramExample: 'exampleA' 
    }). 
    when('/b', { 
    templateUrl: 'test.html', 
    controller: 'MyController', 
    paramExample: 'exampleB' 
}); 

Accesso: iniettare $ percorso nel controller quindi utilizzare questo

app.controller('MyController', ['$scope', '$route', function ($scope, $route) { 
     var paramValue = $route.current.$$route.paramExample; 
     console.log(paramValue); 
} 
3

Il modo più naturale per fare questo sta facendo ciò che si farebbe normalmente quando si vuole caricare una pagina con i parametri: i parametri di utilizzo di query: http://yoururl.com?param1=value&param2=value

ngRoute viene fornito con il servizio $ routeParams che puoi iniettare nel tuo controller. Ora puoi semplicemente recuperare i valori come questo $routeParams.param1.

Un altro modo per fare ciò è recuperare il percorso con $location.path e impostare la variabile lì.

+0

Grazie. Lo farò se non trovo una soluzione per passare i parametri senza mostrarli all'utente. –

+0

Immagino che sarebbe vanificato lo scopo di avere più URL in primo luogo. Un'altra soluzione potrebbe essere l'uso di $ location.path nel controller. – wvdz

12

È possibile utilizzare determinazione e $route.currrent.params.test passare il parametro come questo:

$routeProvider 
    .when('/a', { 
    templateUrl: 'view.html', 
    controller: 'MainCtrl', 
    resolve: { 
     test: function ($route) { $route.current.params.test = true; } 
    } 
    }) 
    .when('/b', { 
    templateUrl: 'view.html', 
    controller: 'MainCtrl', 
    resolve: { 
     test: function ($route) { $route.current.params.test = false; } 
    } 
    }) 

Poi nel controller è possibile accedervi dai $ routeParams:

app.controller('MainCtrl', function($scope, $routeParams) { 
    $scope.test = $routeParams.test; 
}) 

http://plnkr.co/edit/ct1ZUI9DNqSZ7S9OZJdO?p=preview

0

utilizzando $ routeParams

nel Main js file di

routeApp.config(function($routeProvider) { 
$routeProvider 
    .when('/home', { 
     templateUrl: '../sites/./home.html', 
     controller: 'StudentController' 
    }) 
    .when('/viewStudents/:param1/:param2', { 
     templateUrl: '../sites/./viewStudents.html', 
     controller: 'StudentController' 
    }) 
    .otherwise({ 
     redirectTo: '/' 
    }); 
}); 

routeApp.controller('StudentController',['$filter','$routeParams', '$location',function($filter,$routeParams,$location){ 
    var StudentCtrl = this; 
    StudentCtrl.param1 = $routeParams.param1; 
    StudentCtrl.param2 = $routeParams.param2; 
}]); 

chiamando da Home.html

<div class="container"> 
    <h2> Welcome </h2> 
    <a href="#/viewStudents/myname/somevalue2">Students</a> 
</div> 
+0

come è possibile creare/visualizzare gli studenti/i nuovi lavori? in un controller diverso? : S –

+0

Ciao Alberto, non sono sicuro, ma prova a sostituire il nome del controller nella proprietà "Controller". –

+0

L'ho risolto utilizzando una rotta dinamica –

Problemi correlati