如何将AngularJS指令设置为stopPropagation?

时间:2013-01-27 05:34:58

标签: javascript jquery angularjs stoppropagation

我正在尝试“stopPropagation”以防止在点击li中的元素(链接)时关闭Twitter Bootstrap导航栏下拉列表。使用此方法似乎是常见的solution

在Angular中,似乎指令是这样做的地方?所以我有:

// do not close dropdown on click
directives.directive('stopPropagation', function () {
    return {
        link:function (elm) {            
            $(elm).click(function (event) {                
                event.stopPropagation();
            });
        }
    };
});

...但该方法不属于元素:

TypeError: Object [object Object] has no method 'stopPropagation'

我将指令与

联系起来
<li ng-repeat="foo in bar">
  <div>
    {{foo.text}}<a stop-propagation ng-click="doThing($index)">clickme</a>
  </div>
</li>

有什么建议吗?

4 个答案:

答案 0 :(得分:153)

我用过这种方式:创建了一个指令:

    .directive('stopEvent', function () {
        return {
            restrict: 'A',
            link: function (scope, element, attr) {
                if(attr && attr.stopEvent)
                    element.bind(attr.stopEvent, function (e) {
                        e.stopPropagation();
                    });
            }
        };
     });

可以这样使用:

<a ng-click='expression' stop-event='click'>

这是阻止任何类型事件传播的更通用方法。

答案 1 :(得分:123)

“目前一些指令(即ng:click)会阻止事件传播。这会阻止与依赖捕获此类事件的其他框架的互操作性。” - link

......并且能够在没有指令的情况下进行修复,只需执行:

<a ng-click="doThing($index); $event.stopPropagation();">x</a>

答案 2 :(得分:9)

必须在事件对象上调用

stopPropagation,而不是元素本身。这是一个例子:

compile: function (elm) {
    return function (scope, elm, attrs) {
        $(elm).click(function (event) {
            event.stopPropagation();
        });
    };
}

答案 3 :(得分:1)

这是一个简单的抽象指令,用于停止事件传播。我认为它可能对某人有用。只需通过您想要停止的活动。

<div stopProp="click"></div>

&#13;
&#13;
app.directive('stopProp', function () {
  return function (scope, elm, attrs) {
    elm.on(attrs.stopProp, function (event) {
        event.stopPropagation();
    });
  };
});
&#13;
&#13;
&#13;