覆盖 angular ui-router 以链接到页面锚点

override angular ui-router for links to page anchors

我的页面上有指向锚点的链接 (a href="#idea")。 ui-router 显然覆盖了它们。有没有办法协调使用两者?谢谢。

https://gist.github.com/anonymous/2880f2f2c9f91b0b695f#file-gistfile1-txt

你不应该以这种方式在 href 上使用它,相反你应该像下面这样添加它:

<a href="" ng-click="gotoAnchor()">...</a>

您可以在 $anchorScroll API here.

的底部看到一个例子

您好,我在使用锚点时遇到了类似的问题。

因为我想继续使用常规 HTML 语法 (href="#may-hash"),所以我制定了一个指令来查看 link 是否是一个锚点,如果是的话执行滚动操作。详细代码见:

/**
 * Ressource : https://docs.angularjs.org/api/ng/service/$anchorScroll
 */
.directive('a', ['$location', '$anchorScroll', function ($location, $anchorScroll) {
    return {
        restrict: 'E',
        link: function (scope, elem, attrs)
        {
            // href should be defined and not empty
            if(typeof attrs.href!=='undefined' && attrs.href.length > 0)
            {
                // href should be an anchor
                if(attrs.href.substring(0, 1) === '#')
                {
                    elem.on('click', function (e)
                    {
                        // if current hash is different from requested hash
                        // then set new hash
                        // no need to call $anchorScroll() 
                        // since scroll is auto if you've not used $anchorScroll.disableAutoScrolling()
                        if ( '#' + $location.hash() !== attrs.href)
                        {
                            $location.hash(attrs.href);
                        }
                        // if hash is the same, force scroll
                        else
                        {
                            $anchorScroll();
                        }

                    });
                }
            }

        }
    };
}])

更好的方法是这样 假设您处于 app.state1.child 状态并且您的锚标签是 #list,那么假设您 a 标签使用此代码

<a ui-sref="app.state1.child#list">Link</a>

如果你想结合 ui-router 和锚标签,我用这段代码解决了我的问题

<a ui-sref="routename({'#': 'ownerfeatures'})">Link</a> 

我知道这是一个老话题,但总是在寻找更好的解决方案来在我的应用程序中进行锚定。

今天我想在同一页面中滚动并测试了很多不同的解决方案。大多数时候这个是一般推荐:

<a ui-sref="routename({'#': 'ownerfeatures'})">Link</a>

这个问题是可以转换到新状态并转到锚点,但如果您只想在同一页面中滚动,则效果不佳,因为它仅在第一次点击时有效。

然后我意识到 $anchorScroll 的使用应该对此很有用,我制定了这个指令也许可以帮助别人。请注意,我没有使用 location.hash,因为我不想将哈希添加到我的地址栏,而且我的流程中的某些情况会在不需要时使屏幕滚动。

 function anchorScroll($anchorScroll){
    return {
      restrict: 'A',
      scope: {
        target: '=anchorScroll'
      },
      link: function ( scope, element, attrs ) {
        element.bind('click', function(event) {
          console.log(scope.target)
          $anchorScroll(scope.target);
        })
      }
    }
  }

但是也有一个非常简单的方法,就是在模板中使用$anchorScroll。在您的控制器中:

$scope.anchorScroll = $anchorScroll;

并且在视图中:

<a href="" ng-click="anchorScroll('nameOfTheAnchor')">Scroll to ID</a>