Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript angularjs+;路由器:指令控制器和链接函数之间的不同行为_Javascript_Angularjs_Angularjs Directive - Fatal编程技术网

Javascript angularjs+;路由器:指令控制器和链接函数之间的不同行为

Javascript angularjs+;路由器:指令控制器和链接函数之间的不同行为,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我有一个简单的指令externallink,使放置它的链接在单独的窗口中打开url,而不是在当前窗口中打开url <a app-external-link href="http://example.com">Example</a> 此实现按预期工作。让我吃惊的是,我的 第一种方法是使用指令的控制器: angular.module('app', []) .directive('appExternalLink', function ($window) { var con

我有一个简单的指令
externallink
,使放置它的链接在单独的窗口中打开url,而不是在当前窗口中打开url

<a app-external-link href="http://example.com">Example</a>
此实现按预期工作。让我吃惊的是,我的 第一种方法是使用指令的控制器:

angular.module('app', [])
.directive('appExternalLink', function ($window) {
  var controller = function ($element, $attrs) {
    $element.on('click', function (event) {
      event.preventDefault();
      $window.open($attrs.href, '_blank');
    });
  };

  return {
    scope: true,
    controller: controller
  };
});
我不明白为什么(因此这个问题)在指令控制器中 示例链接在新窗口中成功打开,但它也会更改 新url的当前视图

在这种情况下,
event.preventDefault()
似乎什么都不做

你知道为什么会这样吗

更新:

只有当指令与
ui sref

<a app-external-link ui-sref="foo">Example</a>

我有两种可能的解决方案

  • event.stopImmediatePropagation()
    event.preventDefault()
    一起用于
    控制器中的单击处理程序,以阻止当前页面url的更改

    演示

  • ui sref
    已经可以使用
    target=“\u blank”
    了,所以让您的指令将该属性添加到元素中,然后在单击处理程序中执行您想执行的任何操作,而不必担心如何处理事件或使用
    窗口。打开

    element.attr('target', '_blank');
    element.on('click', function (event) {
        //can track clicks or do whatever you want here
        console.log(attrs.href + ' opened in new tab.');
    });
    
    演示


  • 我更喜欢2,因为我列出的原因以及它的代码更少,而且它允许
    angular
    ui router
    独立于您试图做的工作(而不是一定要复制一些逻辑)。此外,我还没有真正测试过那么多1,这可能会影响到我还没有看到的其他东西。不过,如果您愿意这样做的话,它似乎确实有效。

    我有两种可能的解决方案

  • event.stopImmediatePropagation()
    event.preventDefault()
    一起用于
    控制器中的单击处理程序,以阻止当前页面url的更改

    演示

  • ui sref
    已经可以使用
    target=“\u blank”
    了,所以让您的指令将该属性添加到元素中,然后在单击处理程序中执行您想执行的任何操作,而不必担心如何处理事件或使用
    窗口。打开

    element.attr('target', '_blank');
    element.on('click', function (event) {
        //can track clicks or do whatever you want here
        console.log(attrs.href + ' opened in new tab.');
    });
    
    演示


  • 我更喜欢2,因为我列出的原因以及它的代码更少,而且它允许
    angular
    ui router
    独立于您试图做的工作(而不是一定要复制一些逻辑)。此外,我还没有真正测试过那么多1,这可能会影响到我还没有看到的其他东西。不过,如果您愿意这样做的话,它似乎确实有效。

    angular的哪个版本?我想知道,因为如果不删除
    preventDefault
    ,我就无法重现您的问题。另外,如果您将
    href
    保留为空,并且仅将url从其他属性传递到指令中,您甚至不必使用
    preventDefault
    ,因为它“修改html a标记的默认行为,以便在href属性为空时阻止默认操作”@CShark我使用的是1.5.3版,我也不能在plunk中复制它,但我在我的项目中复制了它。所以我需要更仔细地研究这个问题。替代属性方法也是一个好主意。谢谢!好吧,我一直在研究。。。我认为这与在同一个元素中有
    ui sref
    有关。Plunk comming…angular的哪个版本?我想知道,如果不删除
    preventDefault
    ,我就无法重现您的问题。另外,如果您将
    href
    保留为空,并且仅将url从其他属性传递到指令中,您甚至不必使用
    preventDefault
    ,因为它“修改html a标记的默认行为,以便在href属性为空时阻止默认操作”@CShark我使用的是1.5.3版,我也不能在plunk中复制它,但我在我的项目中复制了它。所以我需要更仔细地研究这个问题。替代属性方法也是一个好主意。谢谢!好吧,我一直在研究。。。我认为这与在同一个元素中有
    ui sref
    有关。砰的一声。。。