Как я могу сделать директиву AngularJS для остановкиPropagation?

Я пытаюсь "stopPropagation", чтобы предотвратить выключение панели навигации Bootstrap Twitter после закрытия элемента (ссылки) внутри li. Использование этого метода представляется общим решением .

В 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>

Любые предложения?

Ответ 1

"В настоящее время некоторые директивы (т.е. ng: click) останавливают распространение событий. Это предотвращает взаимодействие с другими структурами, которые полагаются на захват таких событий". - ссылка

... и смог установить без директивы и просто делать:

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

Ответ 2

Я использовал этот способ: Создал директиву:

    .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'>

Это более общий способ остановить распространение любых событий.

Ответ 3

stopPropagation должен быть вызван на объект события, а не на сам элемент. Вот пример:

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

Ответ 4

Вот простая абстрактная директива о прекращении распространения события. Я полагаю, что это может быть полезно кому-то. Просто пройдите в том случае, если вы хотите остановиться.

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

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