在我们的应用中,我们正在使用foobar.com/public/angular
中的静态角度应用文件。主页(foobar.com
)已配置为投放foobar.com/public/angular/index.html
。因此,在我们的索引文件<head>
中,我们有:
<base href="http://foobar.com/public/angular">
但是,在开发过程中,我们使用foobar.com/debug
,这会导致服务器使用它:
<base href="http://foobar.com/public/angular-debug">
服务器从此URL返回未处理的(未缩小的,uglified等)版本的文件。我们也使用角度路线来观察。
TLDR:
foobar.com
foobar.com/debug
<base href="http://foobar.com/public/whatever">
问题是在客户端生成网址。正如评论中所讨论的那样,<a href="#/new/route">Click here</a>
不起作用,因为生成的url包含基本标记,服务器拒绝并且看起来很奇怪,因为用户从其他地方开始:foobar.com/public/angular/#/myRoute
)。我能想到的最好的创建所需的URL是:
/**
* Returns current url after replacing everything after the hashbang with a new string.
*
* @param {string} s - string to change route with (e.g. 'asdf')
* @return {string} - new url e.g. http://google.com/foobar/#!/asdf
*/
makeRouteUrl = function(s) {
var root = $location.absUrl().match(/.*#!/);
if (root && (root.length > 0)) {
root = root[0];
return( root + s );
} else {
// no hashbang in path? Choose home page (not intended use)
return "/";
}
}
然而,这似乎有点粗略。 是否有角度函数不需要上述功能?我已经在$ location,$ route等中查找了函数,但似乎没有任何东西可以正确处理我们的复杂设置。我们需要最终将url作为字符串,而不是导航(我们支持在新标签中打开,因此需要使用ng-href
)。由于Angular应用程序经常使用hashbang url进行路由,我认为必须有一些东西允许你在hashbang之后改变路由,同时仍然保留它前面的内容。
答案 0 :(得分:2)
我不完全确定我是否理解这个问题......
$location.url('/stuff/after/hash?params=hey');
或者,如果您只想在#:
之后设置路径$location.path('/stuff/after/hash');
是我经常使用的。但是你需要在此之后返回没有哈希的url吗? <怎么样
window.location.origin + window.location.pathname
对于没有哈希和参数的当前网址?
答案 1 :(得分:1)
您是否考虑过使用UI Router库?
总的来说,这很棒。
具体到您的问题,UrlMatcher service提供了一种方法format
- 除非我误解了您的要求 - 您正在尝试做什么。
new UrlMatcher('/your/route/here').format(optionalNamedParameters);
// returns a formatted URL