如何将AngularJS指令设置为stopPropagation?

Rob*_*ian 75 javascript jquery stoppropagation angularjs

我试图"停止传播"以防止在点击li中的元素(链接)时关闭Twitter Bootstrap导航栏下拉列表.使用这种方法似乎是常见的解决方案.

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

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

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

TypeError: Object [object Object] has no method 'stopPropagation'
Run Code Online (Sandbox Code Playgroud)

我指的是指令

<li ng-repeat="foo in bar">
  <div>
    {{foo.text}}<a stop-propagation ng-click="doThing($index)">clickme</a>
  </div>
</li>
Run Code Online (Sandbox Code Playgroud)

有什么建议?

Val*_*nov 155

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

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

可以这样使用:

<a ng-click='expression' stop-event='click'>
Run Code Online (Sandbox Code Playgroud)

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


Rob*_*ian 123

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

......并且能够在没有指令的情况下修复,并且只是做:

<a ng-click="doThing($index); $event.stopPropagation();">x</a>
Run Code Online (Sandbox Code Playgroud)

  • 这很完美.我有一个带有表格的下拉列表.我将ng-click ="$ event.stopPropagation()"添加到表单周围的div中,并修复了在单击表单输入时离开的下拉列表.谢谢! (4认同)
  • 对于一次性使用场景很简单.我建议用指令的人谁需要使用在多个地方的代码整个视图 - 为一体,它更容易扩展功能,处理更多的事件,尤其是要尽量保持逻辑出标记之多可能.干杯! (3认同)

Jos*_*ber 9

stopPropagation必须在事件对象上调用,而不是元素本身.这是一个例子:

compile: function (elm) {
    return function (scope, elm, attrs) {
        $(elm).click(function (event) {
            event.stopPropagation();
        });
    };
}
Run Code Online (Sandbox Code Playgroud)