有条件地将target ="_ blank"添加到与Angular JS的链接中

Ben*_*est 32 javascript angularjs

我正在Angular JS中构建一个导航树.树中的大多数链接都指向我网站中的页面,但有些可能指向外部网站.

如果链接的href以http://或https://开头,那么我假设链接是针对外部站点的(正如/^https?:\/\//这样的正则表达式).

我想将target ="_ blank"属性应用于这些链接.当我创建链接时,我希望用角度来做这个:

<ul>
    <li ng-repeat="link in navigation">
        <a ng-href="{{link.href}}" [add target="_blank" if link.href matches /^https?:\/\//]>{{link.title}}</a>
    </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

谁能帮我吗?

谢谢

Mar*_*eck 68

我正要按照建议创建一个指令然后意识到你真正需要做的就是:

<a ng-attr-target="{{(condition) ? '_blank' : undefined}}">
  ...
</a>
Run Code Online (Sandbox Code Playgroud)

ng-attr-xyz让你动态创建@xyz,如果值undefined没有创建属性 - 正是我们想要的.

  • 这对我来说是一个很简单的解决方案.它有条件地写出了在这种情况下我需要的属性.很简单,我知道我可以用几乎任何属性来做到这一点.谢谢! (2认同)

Seb*_*ian 34

更新

或使用指令:

module.directive('myTarget', function () {
    return {
        restrict: 'A',
        link: function(scope, element, attrs) {
          var href = element.href;
          if(true) {  // replace with your condition
            element.attr("target", "_blank");
          }
        }
    };
});
Run Code Online (Sandbox Code Playgroud)

用法:

<a href="http://www.google.com" my-target>Link</a>
Run Code Online (Sandbox Code Playgroud)

当您不需要使用Angular路由时,您只需使用:

<a href="http://www.google.com" target="{{condition ? '_blank' : '_self'}}">Link</a>
Run Code Online (Sandbox Code Playgroud)


w.b*_*ian 5

建议的解决方案仅适用于硬编码的href.如果它们被插值则它们将失败,因为当指令运行时,angular不会进行任何插值.以下解决方案将适用于插值的href,并基于Javarome的解决方案:

yourModule.directive('a', function() {
  return {
    restrict: 'E',
    link: function(scope, elem, attrs) {
      attrs.$observe('href', function(){
        var a = elem[0];
        if (location.host.indexOf(a.hostname) !== 0)
          a.target = '_blank';
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)