目前我正在使用AngularJS框架。我正在使用$ route服务深入链接到我的单页应用程序。
现在我想在我的应用程序中导航,例如,只更改当前URL的搜索部分。在JavaScript中使用$ location服务很容易,但是如何在仅更换搜索部分的情况下从当前路径构造href属性?
我必须手动完成吗?还是有AngularJS方式呢?
加了:
当然,$ location服务具有计算此类URL的所有方法。但是我无法使用它,因为$ location也会将浏览器窗口导航到新的URL。
手动创建URL还有另一个复杂因素:必须检查是否使用了旧版#-method或新的History API。根据这一点,URL必须包含#-sign或不包括。
答案 0 :(得分:12)
按照罗伯特的回答,我找到了Angular.js中的函数。它们是buildUrl,forEachSorted和sortedKeys。 builUrl也使用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('&');
}
答案 1 :(得分:3)
正如您在此处的源代码中所看到的(v.1.1.0):
https://github.com/angular/angular.js/blob/v1.1.0/src/ngResource/resource.js#L228
在这里:
https://github.com/angular/angular.js/blob/v1.1.0/src/ngResource/resource.js#L247
Angularjs不使用内部encodeURIComponent来管理URI字符串,但既不提供使用过的函数。这些函数是模块内部的(我认为很遗憾)。
如果您想以与AngularJS完全相同的方式管理您的URI,也许您可以将这些函数从源代码复制到您的代码中并为此创建自己的服务。