Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用AngularJS以编程方式创建URL_Javascript_Html_Angularjs - Fatal编程技术网

Javascript 如何使用AngularJS以编程方式创建URL

Javascript 如何使用AngularJS以编程方式创建URL,javascript,html,angularjs,Javascript,Html,Angularjs,目前我正在玩弄AngularJS框架。我正在使用$route服务深入链接到我的单页应用程序中 现在我想在我的应用程序中导航,比如说,只更改当前URL的搜索部分。在JavaScript中使用$location服务很容易,但是如何在只替换搜索部分的情况下从当前路由构造href属性呢 我必须用手做吗?还是有办法 增加: 当然,$location服务具有计算此类URL的所有方法。但是我不能使用它,因为$location也会将浏览器窗口导航到新的URL 手工创建URL还有另一个复杂问题:必须检查是使用传统

目前我正在玩弄AngularJS框架。我正在使用$route服务深入链接到我的单页应用程序中

现在我想在我的应用程序中导航,比如说,只更改当前URL的搜索部分。在JavaScript中使用$location服务很容易,但是如何在只替换搜索部分的情况下从当前路由构造href属性呢

我必须用手做吗?还是有办法

增加:

当然,$location服务具有计算此类URL的所有方法。但是我不能使用它,因为$location也会将浏览器窗口导航到新的URL


手工创建URL还有另一个复杂问题:必须检查是使用传统的#-方法还是新的历史API。根据这一点,URL必须包含#符号或不包含#符号。

正如您在这里的源代码(v.1.1.0)中所看到的:

在这里:

Angularjs不在内部使用来管理URI字符串,但也不提供所使用的函数。这些函数是模块内部的(我觉得很遗憾)


如果您想以与AngularJS完全相同的方式管理URI,也许您可以将这些函数从源代码复制到代码中,并为此创建自己的服务。

根据Robert的回答,我在Angular.js中找到了这些函数。它们是buildUrl、forEachSorted和sortedkey。Builur还使用isObject和toJson函数,这是公共函数,因此它们必须分别更改为angular.isObject和angular.toJson

function forEachSorted(obj, iterator, context) {
    var keys = sortedKeys(obj);
    for (var i = 0; i < keys.length; i++) {
        iterator.call(context, obj[keys[i]], keys[i]);
    }
    return keys;
}

function sortedKeys(obj) {
    var keys = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
            keys.push(key);
        }
    }
    return keys.sort();
}

function buildUrl(url, params) {
    if (!params) return url;
    var parts = [];
    forEachSorted(params, function (value, key) {
        if (value == null || value == undefined) return;
        if (angular.isObject(value)) {
            value = angular.toJson(value);
        }
        parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
    });
    return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
}
函数forEachSorted(对象、迭代器、上下文){
var键=分类键(obj);
对于(变量i=0;i
从v1.4开始,您可以使用:

angular.module('util').factory('urlBuilder', function($httpParamSerializer) {
    function buildUrl(url, params) {
        var serializedParams = $httpParamSerializer(params);

        if (serializedParams.length > 0) {
            url += ((url.indexOf('?') === -1) ? '?' : '&') + serializedParams;
        }

        return url;
    }

    return buildUrl;
});
用法

生成
http://url?param1=value1¶m2=value2_1¶m2=value2_2
使用以下命令调用它:

urlBuilder('http://url', { param1: 'value1', param2: ['value2_1', 'value2_2'] });

你的意思是,走这条路线:/something/16,然后做一条新路线,像/something/30吗?是的,像那样。或者将#/something/30?x=4转换为#/something/30?x=5,您可以在$rootScope中跟踪URL的相关部分,然后可以插入一个服务来查看这些值并更改URL。。。只是随地吐痰。您的链接已断开,因为您没有链接到特定的提交:-(@user37078谢谢。我编辑了这篇文章,但我不知道在最新的AngularJS版本中URI字符串是如何管理的,因此,答案可能不再有效。嗨,我可以在angular 6中这样做吗?因为我在angular 6中没有看到任何关于httpparamserializer的文档