Angular.js,取消ng-click事件

时间:2013-03-13 12:53:48

标签: javascript events angularjs

我有这段HT​​ML

<button ui:confirm ng:click="action"></button>

和一些JavaScript

.directive('uiConfirm', function()
{
    return {
        restrict: 'A',
        link: function(scope, element, attrs)
        {
            element.bind('click.confirm', function(event)
            {
                event.preventDefault();
                event.stopPropagation();
            });
        }
    }
})

现在,我正在尝试做的是从指令中取消ng:click事件。 但是无论我做什么,ng:click仍然会被触发。

演示:Fiddle

编辑: 顺便说一句,在此范围内导致错误:

element.bind('click.confirm', function(event)
{
    causeAnError();
    event.preventDefault();
    event.stopPropagation();
});

诀窍,并取消事件传播,但也抛出和丑陋的错误=)

编辑2: 最后我找到了解决方案!

.directive('uiConfirm', function()
{
    return {
        restrict: 'A',
        link: function(scope, element, attrs)
        {
            element.bind('click', function(event)
            {
                scope.$eval(attrs.uiConfirm); // this line of code does the magic!
            });
        }
    }
})

编辑3:

最终解决方案

.directive('uiConfirm', function()
{
    return {
        restrict: 'A',
        link: function(scope, element, attrs)
        {
            /**
             * Clicking the trigger start the confirmation process.
             */
            element.bind('click.confirm', function(event)
            {
                // not confirmed?
                if( ! element.data().confirmed)
                {
                    element.data().confirmed = true;
                    element.addClass('btn-danger');
                }
                // is already confirmed..
                else
                {
                    element.trigger('mouseout.confirm');
                    scope.$eval(attrs.uiConfirm);
                }
            });

            /**
             * Leaving the element, resets the whole process.
             */
            element.bind('mouseout.confirm', function()
            {
                // reset all values
                element.data().confirmed = false;
                element.removeClass('btn-danger');
            });

            // reset the whole process on the first run
            element.trigger('mouseout.confirm');
        }
    }
})

第一次单击按钮,将其变为红色,并且不会触发任何操作。再次单击,调用该操作。离开按钮会重置整个过程。

2 个答案:

答案 0 :(得分:2)

正如对@Flek的回答的评论中所讨论的,要调用属性中定义的函数,

ui:confirm="action()"

使用scope.$eval()

element.bind('click', function(event) {
    scope.$eval(attrs.uiConfirm);  // calls action() on the scope
});

答案 1 :(得分:1)

您有两个嵌套指令:

  1. uiConfirm
  2. ngClick
  3. 然后绑定两个事件处理程序(一个通过uiConfirm,另一个通过ngClick)。 使用 preventDefault ,您希望停止默认操作,但我想按钮的默认操作不是调用action()方法。 stopPropagation 只是阻止事件从冒泡向上生成DOM树,但由于您只关心按钮本身,因此它不会改变任何内容。

    我要做的是在指令中创建自定义操作方法,然后检查它是否应该执行某些操作。

    .directive('uiConfirm', function()
    {
        return {
            restrict: 'A',
            link: function(scope, element, attrs)
            {
                scope.action = function(){
                    // Check whether there is something to do or not.
                };
            }
        }
    })