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;
    }

稍后我用存储在服务对象中的值触发动画,或者获取一个新值,动画完成后我清除服务中的值。