2013-03-12 25 views
25

Bazı yolları tanımlamıştır:Konum değiştiğinde rota adı nasıl alınır?

angular.module('myApp', []) 
    .config('$routeProvider', function($routeProvider) { 
    $routeProvider.when('/aaa', { templateUrl: '/111.html' }) 
        .when('/bbb', { templateUrl: '/222.html'}); 
    }); 

Ve kullanıcı rotayı değiştirdiğinde güzergah adını almak istiyorum:

angular.module('myApp') 
    .run(['$rootScope', function($rootScope) { 
    $rootScope.$on('$routeChangeSuccess', function(scope, current, pre) { 
     // how to get current route name, e.g. /aaa or /bbb 
     console.log('Current route name: ' + ???); 
    } 
    }]); 

Ama bunu elde etmek için nasıl bilmiyorum. templateUrl'u, ancak rota adını alamıyorum.


GÜNCELLEME

Daha karmaşık bir kullanım durumu: geçerli yoldur

$routeProvider.when('/users/:id', { templateUrl: '/show_user.html' }) 

ise:

/users/12345 

O /users/:id eşleşmesi gerekir, ama nasıl anlarım hangi rota eşleştirilir ve rota adıolsun?

cevap

61

$ konum hizmetini enjekte edebilir ve yol() işlevini kullanabilirsiniz.

angular.module('myApp') 
    .run(['$rootScope','$location', '$routeParams', function($rootScope, $location, $routeParams) { 
    $rootScope.$on('$routeChangeSuccess', function(e, current, pre) { 
     console.log('Current route name: ' + $location.path()); 
     // Get all URL parameter 
     console.log($routeParams); 
    }); 
    }]); 

Size Geçerli rota parametreleri bir dizi sahip olmak istiyorsanız, docs

UPDATE

diğer yararlı $ konum yöntemlerini bulmak sadece benim gibi $ routeParams hizmetini enjekte yukarıda yaptı.

+0

@Flex, Bilginize benim güncellenen soru :) – Freewind

+2

Bkz : açısal bir hatta işleyicisi ilk argümanı kapsamı değil, bir olay . Kod snippet'inizi bunu yansıtmak için düzenledim. FWIW, "currentScope" olay nesnesinde kullanılabilir. –

+0

kötü bir sözdizimi var ve düzeltme yaptıktan sonra bile çalışmıyor: Bilinmeyen sağlayıcı: $ routeParamsProvider <- $ routeParams – Mike

7

$location ve $routeParams'u enjekte etmeniz gerekmez.
Sen (:id olmadan, vb) current.$$route.originalPath

app.run(function ($rootScope) { 
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) { 
     console.log(current.$$route.originalPath); 
    }); 
}); 

Bu basit yolları yeter kullanabilirsiniz. Daha karmaşık kullanım durumuyla /users/:id dönecektir.
Ancak :id param öğesini current.params.id'dan ayıklayabilir ve tam yoldan değiştirebilirsiniz. (Birkaç params varsa mesela)

app.run(function ($rootScope) { 
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) { 
     var fullRoute = current.$$route.originalPath, 
      routeParams = current.params, 
      resolvedRoute; 

     console.log(fullRoute); 
     console.log(routeParams); 

     resolvedRoute = fullRoute.replace(/:id/, routeParams.id); 
     console.log(resolvedRoute); 
    }); 
}); 

rota dize, bu Flek cevabı kıyasla dağınık olabilir ilgisi tam olarak ne gerek bağlı olarak, ya da rota params bağlı olmasını istemiyorsanız isimler.

Not Not: $on açılış ayracına ilişkin kodunuzda eksik bir kapanış ayracı var. Açısal içinde $$ özellikleri özel olması önerilmektedir ve bizim kodundan doğrudan demiyorlar gerektiği gibi

Düzenleme 15/01/2014

görünüyor.

2

Değil çok şık bir çözüm ve Chrome DevTools'un bunu test sadece, ama o iş gibi görünüyor: Bu kullanmak isteyen Diğerleri için

Object.getPrototypeOf($route.current) === $route.routes['/users/:id]; 

, sadece kullanılan desenli '/users/:id' değiştirdiğinizde rotanı tanımladın. Eğer aksi yolunu eşleştirmek istiyorsanız,

Ayrıca sadece $route.routes['null']

Yasal kullanın: Bu buldum ve benim için çalışıyor sadece bir çözümdür. Bu davranışın belgelenmediği ve tüm senaryolarda işe yarayıp yaramadığını test etmediğim göz önüne alındığında, bunu kendi sorumluluğunuzda kullanın.

0

ben kolayca dan yolunu alabilirsiniz düşünmek current

app.run(function ($rootScope) { 
    $rootScope.$on('$routeChangeSuccess', function (e, current, pre) { 
     console.log(current.originalPath); // Do not use $$route here it is private 
    }); 
}); 
İlgili konular