Angularjs $location 服务显然没有解析 url?

Posted

技术标签:

【中文标题】Angularjs $location 服务显然没有解析 url?【英文标题】:Angularjs $location service apparently not parsing url? 【发布时间】:2013-04-23 16:22:57 【问题描述】:

我在一个应用程序中使用 Angular,它基本上是一个带有搜索结果的表格。 可以通过像http://myapp/?client=clientName这样的url来访问这个表

为表格实例化一个角度控制器,除其他外,用于打开带有行详细信息的模态对话框(也是基于角度的 bootstrap-ui)。

这些行详细信息是通过一个服务带来的,该服务对两个控制器都有一些共同的功能:一个用于表格,一个用于模式。

现在,在这项服务中,我有以下 sn-p 需要检索:

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() 返回一个空对象。

我正在使用默认值在我的服务中注入 $location 服务(也就是说,不是通过.config() 调用来配置它)。 而且,正如医生所说:

$location 服务解析浏览器地址栏中的 URL(基于 在 window.location 上)并使 URL 可用于您的 应用。

我错过了什么吗?此时不应该解析 URL 吗?

谢谢!


更新:我已经成功了。问题正是我根本没有配置服务。我这样做是因为我认为这样会采用默认值,但它似乎不是这样工作的。

【问题讨论】:

你能分享 $location.absUrl() 的输出吗?这闻起来像一个正则表达式问题。 当然!这是http://localhost:3000/results?utf8=%E2%9C%93&client=mond&type=&submittedLowerBound=&submittedUpperBound=&commit=Filter。这是后端的 Rails 应用程序。 你能分享一些你的解决方案的代码吗?我有同样的问题 $location.search() 返回 【参考方案1】:

在我的应用程序模块配置中配置 $locationProvider 之前,我遇到了同样的问题:

appModule.config(['$locationProvider', function($locationProvider) 
        $locationProvider.html5Mode(true);
    ]);

【讨论】:

这样,如果浏览器不支持 html5 模式,angular 将回退到 hashbang url,顺便说一句,有人知道如何在没有 html5 模式和 angular 路由器的情况下获取查询参数? 另请注意,当您将其设置为html5Mode时,您的html文件中还必须有一个基本标记。 另请注意,您可能需要添加$locationProvider.hashPrefix(''); docs.angularjs.org/guide/migration#commit-aa077e8【参考方案2】:

如果不想指定base标签,可以指定require base false。

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

【讨论】:

【参考方案3】:

当我遇到这个问题时,除了设置配置之外对我有用的另一件事是在查询字符串前面添加“#”。

因此,如果您是创建查询字符串的人,则更改 myapp/?client=clientNamemyapp/<strong>#</strong>?client=clientName

允许 $location.search() 给我一个非空对象,然后您可以使用 $location.search()['client'] 访问每个参数

【讨论】:

谢谢。此评论应在官方文档中。 :)【参考方案4】:

$location.search 的 API 相当混乱。调用

$location.search('client');

会将搜索对象设置为 client: true 并返回 $location。此外,您有一个错字client 而不是'client',因此它将搜索设置为一个空对象。所以你可能想要:

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

【讨论】:

谢谢,Jmr,我修正了错字。但重要的是,此时$location.search() 只返回 对不起,我错过了你在问题的开头放置了断点,我想也许 $location.search(client) 覆盖了它。在那种情况下,我不确定发生了什么, $location.search() 在我的机器上解析你的 URL。【参考方案5】:

你可以根据这个评论https://github.com/angular/angular.js/issues/7239#issuecomment-42047533编写解析$window.location.search的函数

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'];

【讨论】:

以上是关于Angularjs $location 服务显然没有解析 url?的主要内容,如果未能解决你的问题,请参考以下文章

『AngularJS』$location 服务

angularJS: $location 服务

[AngularJS] $location 服务简介

angularjs-$location

$window.location.href 在 AngularJS 中不起作用

angularjs-$location 服务