2013-04-29 102 views
29

我在一個應用程序,它是,基本上,與搜索結果的表使用的角度。 訪問這個表能夠經由URL等http://myapp/?client=clientName

的角控制器被實例化的表,除其他事項外,用於與所述行信息打開一個模態對話框(也基於角度與自舉-UI)來實現。

這些行的細節是通過一個服務,它具有兩個控制器的一些共同的功能:一個用於表和模態。

現在,這個服務中,我有以下的代碼片段檢索:

service.fetchRelatedElements = function(element, cb) { 
    var url = '/search.json?results=20&type='+element.type; 
    if ($location.search()['client']) { 
    url += '&client=' + $location.search('client'); 
    } 
    return doFetch(url, cb); // actual server json GET 
}; 

的目標是要知道,如果表已將此具體client參數設置爲一個過濾器。

如果我在本次調用的開始處放置了一個斷點,我看到$location.absUrl()返回當前的瀏覽器URL(在我的情況下,它有我感興趣的client參數)。

$location.search()返回一個空的對象。

我用我的默認服務中注入$位置服務(即,不是由.config()調用需要配置)。 而且,正如醫生說:

的$定位服務解析在瀏覽器地址欄(在基於window.location的 )的網址,使現有的URL到您的 應用。

我錯過了什麼嗎?這個URL不應該被解析嗎?

謝謝!


更新:我設法使它工作。問題恰恰在於我沒有配置所有的服務。我這樣做是因爲我認爲以這種方式將採取默認值,但似乎這不是它的工作方式。

+0

你可以分享$ location.absUrl()的輸出嗎?這聞起來像一個正則表達式問題。 – Jmr 2013-04-29 21:24:16

+0

當然!它是'http:// localhost:3000/results?utf8 =%E2%9C%93&client = mond&type =&submittedLowerBound =&submittedUpperBound =&commit = Filter'。 這是後端的Rails應用程序。 – Pipetus 2013-04-29 21:37:53

+4

你能爲你的解決方案分享一些代碼嗎?我有相同的問題,其中$ location.search()返回{} – sthomps 2013-05-16 01:35:23

回答

42

我在之前,我在我的應用程序的模塊配置配置$locationProvider同樣的問題:

appModule.config(['$locationProvider', function($locationProvider) { 
     $locationProvider.html5Mode(true); 
    }]); 
+3

用這種方式角會回退到hashbang url,如果瀏覽器不支持html5模式,順便說一下,有人知道如何獲得查詢參數沒有HTML5模式和路由器角? – 2014-05-23 08:47:11

+0

是的,對於HTML5模式,它的效果很好,但回退仍然失敗。 – Magne 2014-05-30 10:17:19

+1

還要注意,當您將其設置爲html5Mode時,您還必須在html文件中具有基本標記。 – 2015-02-20 21:40:51

3

$ location.search的API非常混亂。調用

$location.search('client'); 

會將搜索對象設置爲{client:true}並返回$ location。此外,你有一個輸入錯誤client而不是'client',所以它將搜索設置爲空對象。所以,你可能想:

url += '&client=' + $location.search()['client']; 
+0

謝謝,Jmr,我修復了錯字。但重要的是,在這一點上,$ location.search()只返回'{}'。 – Pipetus 2013-04-29 22:04:17

+0

對不起,我錯過了你在問題開始時放置了斷點,我想可能是$ location.search(client)重寫它。在這種情況下,我不確定發生了什麼,$ location.search()會在我的機器上正確解析您的URL。 – Jmr 2013-04-29 22:12:16

3

你可以寫一些解析$ window.location的功能。您可以根據此評論https://github.com/angular/angular.js/issues/7239#issuecomment-42047533

function parseLocation(location) { 
    var pairs = location.substring(1).split("&"); 
    var obj = {}; 
    var pair; 
    var i; 

    for (i in pairs) { 
     if (pairs[i] === "") 
      continue; 

     pair = pairs[i].split("="); 
     obj[decodeURIComponent(pair[0])] = decodeURIComponent(pair[1]); 
    } 

    return obj; 
} 

$scope.query = parseLocation($window.location.search)['query']; 
5

當我遇到了這個問題,這爲我工作,除了設置配置的另一件事是添加「#」查詢字符串的前面。

所以,如果你是一個創造的查詢字符串,然後改變
myapp/?client=clientName

myapp/#?client=clientName

允許$ location.search()給我一個非空的對象,然後你可以訪問每個參數使用$location.search()['client']

+1

謝謝。這個評論應該在官方文檔中。 :) – under5hell 2015-10-27 04:34:53

9

如果您不想指定基本標記,則可以指定require base false。

myapp.config(function($locationProvider) { 
    $locationProvider.html5Mode({ 
     enabled: true, 
     requireBase: false 
    }); 
});