2014-12-17 12 views
31

Mam wiele tras, które wywołują ten sam kontroler i chciałbym przekazać do niego różne zmienne.

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

wiem, że mogę użyć "resolve" obiektu:

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

Aby przekazać wartość jako zależność:

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

Mój problem z tego podejścia jest to, że moim app ulega awarii, jeśli brakuje obiektu rozstrzygnięcia na innych trasach i chciałbym przekazać opcjonalne parametry.

Czy istnieje sposób przekazywania określonych parametrów do sterownika (od dostawcy trasy)?


Dziękuję

Odpowiedz

48

Routing :

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

dostępu: wstrzykiwać $ trasy w kontrolerze następnie użyć tego

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

Najbardziej naturalnym sposobem na to jest robić to, co normalnie można zrobić, gdy chcesz, aby załadować stronę z parametrów: parametry użycie zapytania: http://yoururl.com?param1=value&param2=value

ngRoute pochodzi z service $ routeParams, które możesz wprowadzić do kontrolera. Teraz możesz po prostu pobrać wartości takie jak ta $routeParams.param1.

Innym sposobem, aby to zrobić, jest pobranie ścieżki za pomocą $location.path i ustawienie tam zmiennej.

+0

Dziękuję Ci. Zrobię to, jeśli nie znajdę rozwiązania, aby przekazać parametry bez pokazywania ich użytkownikowi. –

+0

Sądzę, że w pierwszej kolejności wyeliminowałoby to cel posiadania wielu adresów URL. Innym rozwiązaniem może być użycie $ location.path w twoim kontrolerze. – wvdz

12

Można użyć determinację i $route.currrent.params.test przekazać parametr takiego:

$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; } 
    } 
    }) 

Następnie w kontrolerze można uzyskać do niego dostęp od $ routeParams:

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

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

0

użyciu $ routeParams

w głównych js pliku

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; 
}]); 

dzwonisz home.html

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

jak zrobić/viewStudents/new works? w innym kontrolerze? : S –

+0

Witam Alberto, nie jestem tego pewien, ale spróbuj zastąpić nazwę kontrolera we właściwościach "Kontrolera". –

+0

Rozwiązałem go za pomocą dynamicznej trasy –

Powiązane problemy