2016-12-01 105 views
1

我需要在打開新窗口並導航到某個狀態後修改URL。在Angular環境中替換URL

我的起始頁看起來像這樣:
localhost:8000/startpage.html
當它加載的URL變成
localhost:8000/startpage.html#/
在新窗口中,我正在導航到一個新狀態:
localhost:8000/startpage.html#/newstate

我想要的是這樣的網址:
localhost:8000/startpage.html?project=1#/newstate

我得到幾乎正確的結果,只是不用更換URL完全把它添加
?project=1#/newstatelocalhost:8000/startpage.html#/

所以結果是這樣的:
localhost:8000/startpage.html#/%3Fproject=903%23/newstate
而我需要的是:
localhost:8000/startpage.html?project=903#/newstate

下面是一些相關的代碼:

if ($window.history.replaceState) { 
    var newUrl = '?project=903' + '#/case'; 
    $location.path(newUrl); 
    $location.replace(); 
}; 

在我看來,我有兩個問題。在'.html'之後加上'#/',並對URL進行編碼。因爲即使我刪除了多餘的'#/',它仍然不起作用,除非我用真正的字符替換編碼的字符。 請幫忙。

感謝

+0

它不是真正清楚你正試圖在這裏完成的。'#'表示由Angular處理的部分與由服務器處理的部分。一個類似於'localhost:8000/startpage.html?project = 1#/ newstate'的URL表明你想要發送'project = 1'到你的服務器並讓它發回一個新的頁面,這個頁面會有一個新的角度應用,然後將其引導至「新國家」。這看起來相當麻煩...... – Claies

回答

2

我認爲你正在使用錯誤的方法。您希望使用$location.url,這將允許您一次設置path,queryhash值。但是,您可能會更好地分別設置queryhash,因爲您不需要更改整個網址。

$location.search('project', '903'); 
$location.hash('case'); 

我從hash刪除/,因爲它是沒有必要的。

此外,默認情況下,角度使用散列模式來導航其路線。如果你想提供散列,我認爲你需要關閉這種行爲。

$locationProvider.html5Mode(true); 

在應用程序的配置中設置該值。

這裏是一個很好的文章:https://scotch.io/tutorials/pretty-urls-in-angularjs-removing-the-hashtag

+0

不,那看起來像這樣:localhost:8000/startpage.html#/ case?project = 903#%2Fcase – Mark

+0

你是否在調用'$時手動添加'#' location.hash'? –

+0

不,我只有這兩行:$ location.search('project','903'); $的location.hash( '案件'); – Mark

1

隨着AngularJs 1#符號通常遵循加載ngApp指令的網頁...請糾正我,如果我錯了。

所以我認爲唯一的解決辦法是有,你想要的#標籤出現在頁面鏈接ngApp指令......

這是一個非常不好的做法壽。