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
有关。砰的一声。。。