Angular - 如何编码 url 以在 $routeProvider 中被识别 - 当哈希更改为 %23 时
Angular - how to get encoded url to be recognised in $routeProvider - when a hash is changed to %23
一些电子邮件客户端(显然)将 url 中的哈希编码为 %23,(例如,#/path#sectionId 变为 #/path%23sectionId 或 %23/path%23sectionId)。
当访问这样的 url angular 时,使用 $routeProvider 的其他专有功能并将您重定向到默认页面。 (我认为)
如何在 $routeProvider.when 相应地重定向您之前解码 url?你知道有什么解决方法吗?理想情况下,除了不使用哈希滚动到页面上的某个部分。
谢谢。
到目前为止我发现的解决方法:向我的主控制器添加一个 $location 依赖项显示 $location.hash return '' 和 $location.path returns '/路径#sectionId'。
基于此,我们可以在controller的顶部添加如下内容:
// when has in url is encoded to %23, location.hash does not recognize it, and it gets cleared from the path in $RouteProvider
var holdHash = $location.path();
holdHash = holdHash.split('#');
if (holdHash.length > 1) { // if it has an item after the hash in the array
$location.hash(holdHash.pop()); //take that item and use it as a hash
}
但是您丢失了 $location.search
中的值
或者你可以这样做:
$location.url(decodeURIComponent($location.url()))
这也保留了您的搜索,但替换了“?”使用“%3F”,然后 return 将其放入 $location.ash 而不是 $location.search。
他们的解决方案在某种程度上有点老套,而且不能完全工作(参见 $location.search 的问题)
***** 编辑 2 解决方案 ****
作为我的问题的最终解决方案,我更新了存储 id 的服务,并首先在我的主控制器中触发哈希检测。还更新了 has 检测以记住可以存储的所有变体:
/**
* tries to get hash from $location
* if unavailable tries to look for encoded hash
* if unavailable returns null
* @return {string or null} [a string with the id of the section or null]
*/
function getHashID() {
var fromLoc = $location.hash(),
fromEncodedUrl,
inPath;
if (fromLoc.length) {
return fromLoc;
}
// iphone Chrome encodes the pound sign on redirect
fromEncodedUrl = $location.url();
fromEncodedUrl = fromEncodedUrl.split('%23');
if (fromEncodedUrl.length > 1) {
return fromEncodedUrl.pop();
}
inPath = $location.path();
inPath = inPath.split('#');
if (inPath.length > 1) {
return inPath.pop();
}
return null;
}
稍后我用存储在服务对象中的值触发动画,或者获取一个新值,动画完成后我清除服务中的值。
一些电子邮件客户端(显然)将 url 中的哈希编码为 %23,(例如,#/path#sectionId 变为 #/path%23sectionId 或 %23/path%23sectionId)。
当访问这样的 url angular 时,使用 $routeProvider 的其他专有功能并将您重定向到默认页面。 (我认为)
如何在 $routeProvider.when 相应地重定向您之前解码 url?你知道有什么解决方法吗?理想情况下,除了不使用哈希滚动到页面上的某个部分。
谢谢。
到目前为止我发现的解决方法:向我的主控制器添加一个 $location 依赖项显示 $location.hash return '' 和 $location.path returns '/路径#sectionId'。
基于此,我们可以在controller的顶部添加如下内容:
// when has in url is encoded to %23, location.hash does not recognize it, and it gets cleared from the path in $RouteProvider
var holdHash = $location.path();
holdHash = holdHash.split('#');
if (holdHash.length > 1) { // if it has an item after the hash in the array
$location.hash(holdHash.pop()); //take that item and use it as a hash
}
但是您丢失了 $location.search
中的值或者你可以这样做:
$location.url(decodeURIComponent($location.url()))
这也保留了您的搜索,但替换了“?”使用“%3F”,然后 return 将其放入 $location.ash 而不是 $location.search。
他们的解决方案在某种程度上有点老套,而且不能完全工作(参见 $location.search 的问题)
***** 编辑 2 解决方案 ****
作为我的问题的最终解决方案,我更新了存储 id 的服务,并首先在我的主控制器中触发哈希检测。还更新了 has 检测以记住可以存储的所有变体:
/**
* tries to get hash from $location
* if unavailable tries to look for encoded hash
* if unavailable returns null
* @return {string or null} [a string with the id of the section or null]
*/
function getHashID() {
var fromLoc = $location.hash(),
fromEncodedUrl,
inPath;
if (fromLoc.length) {
return fromLoc;
}
// iphone Chrome encodes the pound sign on redirect
fromEncodedUrl = $location.url();
fromEncodedUrl = fromEncodedUrl.split('%23');
if (fromEncodedUrl.length > 1) {
return fromEncodedUrl.pop();
}
inPath = $location.path();
inPath = inPath.split('#');
if (inPath.length > 1) {
return inPath.pop();
}
return null;
}
稍后我用存储在服务对象中的值触发动画,或者获取一个新值,动画完成后我清除服务中的值。