当前位置: 首页 > 知识库问答 >
问题:

使用ng include保留传统的锚行为

唐修能
2023-03-14

我不是在构建一个单页应用程序,而是在某些地方使用AngularJS的“传统”站点。我遇到了以下问题(使用1.3.0-beta.6):

标准,工作锚链接:

<a href="#foo">Link text</a>
... [page content]
<a id="foo"></a>
<h1>Headline</h1>
[more content]

那很好。现在我在某处介绍一个模板:

<script type="text/ng-template" id="test-include.html">
  <p>This text is in a separate partial and inlcuded via ng-include.</p>
</script>

可通过以下方式调用:

<div ng-include="'test-include.html'"></div>

部分已正确包含,但锚链接不再工作。点击链接文本现在将显示的URL更改为/#/foo而不是/#foo并且页面位置不会更改。

我的理解是,使用ng include隐式地告诉Angular我想要使用routes系统并覆盖浏览器的本机锚链接行为。我看到了一些建议,建议将我的html锚链接更改为。/#foo,但由于其他原因,我不能这样做。

我不打算使用routes系统-我只想使用ng include,而不会影响浏览器行为。这可能吗?

共有3个答案

百里景山
2023-03-14

这是最好的解决方案,适用于Angular的最新版本:

在AngularJS中关闭URL操作

淳于飞鸾
2023-03-14

我的理解是,使用ng-包含隐式地告诉Angular我想使用路由系统,并覆盖浏览器的本机锚链接行为。我已经看到了通过将我的html锚链接更改为#/#foo来解决这个问题的建议,但由于其他原因,我不能这样做。

路由系统是在一个单独的模块ngRoute中定义的,因此,如果您没有自己注入它——我很确定您没有注入它——它根本无法访问。

这里的问题有些不同。

ng include取决于:$http$templateCache$anchorScroll$animate$sce。因此,请使用ng include启动所有这些服务。

最自然的候选调查将是$anchorScroll$anchorScroll的代码似乎没有任何危害,但是服务依赖于$windows$位置$rootScope。第616行的代码是:

 baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''

所以基本上,如果之前没有设置,基本href被设置为"

现在看这里-从巴卢斯回答:

至于使用命名锚点,比如,对于标记,您基本上声明了与之相关的所有相对链接,包括命名锚点。所有的相对链接都不再与当前的请求URI相对(如果没有标记,就会发生这种情况)。

我今天没有太多时间,所以无法自己测试它,但我会尝试检查的第一个选项是连接到“$locationChangeStart”事件,如果新url是#xxxxxx类型,只需防止默认行为,并改为使用$anchorcroll本机方法滚动

我认为这个代码应该做的工作:

$scope.$on("$locationChangeStart", function (event, next, current) {

    var el, elId;

    if (next.indexOf("#")>-1) {
        elId = next.split("#")[1];
        el = document.getElementById(elId);
        if(el){
           // el.scrollIntoView(); do not think we need it
           window.location.hash = "#" + elId;
           event.preventDefault();
        }    
    }
});
闻人越
2023-03-14

原因是angular重写了标准HTML标记的行为,其中包括

您应该将href属性替换为ngClick as:

<a ng-click="scroll()">Link text</a>

在控制器中,这样:

function MyCtrl($scope, $location, $anchorScroll) {
  $scope.scroll = function() {
    $location.hash('foo');
    $anchorScroll();
  };
};

演示:http://jsfiddle.net/HB7LU/3261/show/

<a href='##foo'>Link text</a>

演示:http://jsfiddle.net/HB7LU/3262/show/

更新:我不知道你不想在HREF中修改。但是,您仍然可以通过覆盖现有的a指令来实现所需的结果,如下所示:

myApp.directive('a', function() {
  return {
    restrict: 'E', 
    link: function(scope, element) {
        element.attr('href', '#' + element.attr('href'));
    }
  };
});

演示:http://jsfiddle.net/HB7LU/3263/

 类似资料:
  • 如果你默认使用Markdown编辑器编辑文档,但是文字中存在一些 Markdown 的保留字。 例如: 表中中出现 | 需要输入 ` 需要成对的出现 [ ] >和<也是需要转义后才能显示。 等等,一些特殊需求。可以通过unicode编码来解决。 将要输入的字符进行转义,之后使用转义字符即可。 常见转义字符: 原字符 转义字符 | | ` ` ] ] [ [ > &gt; < &lt; @ @ #

  • #include <stdio.h> union Type { int a; int *b; }; int main() { printf("sizeof(union Type) is %lu\n", sizeof(union Type)); return 0; } 技巧 使用gcc -g编译生成的程序,是不包含union Type的符号信息: (gdb) p sizeof(

  • 我必须解析一些html并移除锚标记,但我需要保留锚标记的innerHTML 例如,如果我的html文本是: 现在我可以解析上面的html并在jsoup中选择如下所示的标记, 我可以通过, 但是它会从开始括号到结束括号删除完整的achor标记,并且内部html会丢失,如何才能保留只删除开始和结束标记的内部html。 另外,请注意:我知道有从元素中获取outerHTML()和innerHTML()的方

  • 问题内容: 我有一个带有textarea的表单,我想保留输出内容时用户输入的换行符。 例如,如果我在textarea中写: 这是一个句子。这是另一个。这里还有一个。 这是一个新段落。这是一个新句子。这是另一个。 我想要相同的输出,而 不是 : 这是一个句子。这是另一个。这里还有一个。这是一个新段落。这是一个新句子。这是另一个。 如何保留换行符? 问题答案: 通常,您只需要添加 空格修剪为单个空格

  • 问题内容: 我的代码而不是使用代码,因为我之前有过。 所以我的代码: 项目说明包含未呈现的换行符。 假设我已具备上述条件,如何轻松显示换行符? 问题答案: 基于@pilau的答案-但经过改进,即使是公认的答案也没有。 这将使用给定的换行符和空格,但也会在内容边界处中断内容。有关空白属性的更多信息,可以在这里找到: https://developer.mozilla.org/zh-CN/docs/W

  • 问题内容: 我对此还有些陌生,因此我可能不知道所有常规术语: 使用JSON编码时是否可以保留Python元组?现在给我一个清单。我不想将元组转换为列表,但是我想使用JSON。那么,有选择吗? 原因:我正在创建一个使用多维数组的应用程序,但并不总是相同的形状。我有一些使用递归来探测数组并将端点转换为字符串或整数的类方法。我最近意识到(基于递归的工作方式)我可以使用元组来防止对数组进行更深入的递归搜索