2013-07-07 34 views
1

什麼,我是什麼讓本地化的網址,如:如何動態添加前綴到AngularJS路線

讓我們假裝我們總是知道用戶lang。

angular.module('website', []) 
.constant('ROUTES', (function() { 
    var lang = 'eng'; // just for example 
    return { 
     SOME_PATH: '/' + lang + '/somepath' 
    } 
})()) 
.config([..., '$locationProvider', 'ROUTES', function(..., $locationProvider, ROUTES { 
    $routeProvider.when(ROUTES.SOME_PATH, {templateUrl: 'pages/some_page.html', controller:  'SomePageController'}); 
    $locationProvider.html5Mode(true); 
}]) 
.run(['$rootScope', 'ROUTES', function ($rootScope, ROUTES) { 
    $rootScope.ROUTES = ROUTES; 
}]); 

所以,如果我添加鏈接在HTML中,everithing作品:

<a href="{{ROUTES.SOME_PATH}}">Some path</a> 

我之後單擊只是按計劃鏈路路由的工作。 但是,如果我刷新頁面或直接鏈接(「http://example.com/eng/somepath」),我無法到達任何頁面,看到一個404頁面。

+0

你的網址中的'#'在哪裏? http://mysite.com/eng/somepath必須是http://mysite.com/#/eng/somepath,否則瀏覽器將向服務器請求完全不同的URL。只有服務器設置可以爲您重新映射。 – lossleader

+0

@lossleader你不需要'#',因爲'$ locationProvider'將它的html5Mode設置爲true –

+0

是的,這是因爲$ locationProvider.html5Mode(true);在瀏覽器中不支持HTML5模式'#'將存在 –

回答

2

用$ routeProvider映射路由不會更容易嗎?

$routeProvider.when('/:langId/:somepath', 
    { 
    controller: 'languageHandlingController' 
    }) 
+0

它可能有用,我應該嘗試 –

+0

所以,它的工作,但只有在移動:langId參數到URL的末尾:http:// mysite.com/somepath/ger。可能是因爲url# –

+0

中的'#',它應該以兩種方式工作。也許是你的控制器中的東西。如果你想發佈更多的代碼,我可以嘗試幫助你。 – pasine

0

我認爲最好的選擇是讓網址成爲http://mysite.com/somepath?lang=en之類的東西,然後您可以直接從網址中讀取lang

+0

是的,這是更傳統的路徑。唯一的原因是kepp url清除了額外的參數。而且,imho,像http://mysite.com/ger/somepath這樣的網址看起來很漂亮 –