Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS(1.1.5):您可以使用优先级cancel取消指令吗_Angularjs_Angularjs Directive_Angularjs Scope - Fatal编程技术网

AngularJS(1.1.5):您可以使用优先级cancel取消指令吗

AngularJS(1.1.5):您可以使用优先级cancel取消指令吗,angularjs,angularjs-directive,angularjs-scope,Angularjs,Angularjs Directive,Angularjs Scope,当您有一个优先级>0的自定义ng click指令首先触发时,是否可以阻止内置ng click处理程序触发?还是以某种方式延迟内置的 在我的例子中,我有一个自定义的ngClick指令,它将动画应用于元素,然后等待动画完成。一旦完成,并且只有到那时,内置的NGO才会单击“点火”。原因是单击的元素位于滑出抽屉上,该抽屉自动隐藏在ngClick处理程序中。如果指令不能阻止它触发,那么在动画开始之前抽屉就关闭了 从custom指令中,我可以使用它来调用默认的ngClick,但是在这种情况下需要取消原始命令

当您有一个优先级>0的自定义ng click指令首先触发时,是否可以阻止内置ng click处理程序触发?还是以某种方式延迟内置的

在我的例子中,我有一个自定义的ngClick指令,它将动画应用于元素,然后等待动画完成。一旦完成,并且只有到那时,内置的NGO才会单击“点火”。原因是单击的元素位于滑出抽屉上,该抽屉自动隐藏在ngClick处理程序中。如果指令不能阻止它触发,那么在动画开始之前抽屉就关闭了

从custom指令中,我可以使用它来调用默认的ngClick,但是在这种情况下需要取消原始命令

要求:解决方案不应要求开发人员在其ngClick处理程序中编写任何代码。我当然可以在控制器中编写代码,但我不想让控制器知道它应该等待。i、 e.如果我改变指令执行指标的方式,并且需要不同的时间

$timeout(function() {service.close();}, 400);
下面是我想要完成的一个例子

加价

控制器


有什么想法吗?有更好的方法吗

我建议您使用scope.$evalatAttributes.preClick而不是邪恶的浏览器eval…我同意@gustavohenke。只是为了说明的目的把它拼凑在一起。现在,如何取消真正的点击。我想知道,停止传播能起作用吗?不,停止传播和预防默认不起作用。嗯,能解决这个问题吗?你有没有找到另一种方法?
<li ng-repeat="product in service.products"
    ng-click="onClick('{{product}}')"
    pre-click="onClicking('{{product}}')"
    animate="wasClicked(product)">
    {{product}}
</li>
angular.module('sales.directives')
    .directive('ngClick', [
        '$timeout',
        function ($timeout) {
            return {
                priority: 50,  // higher priority
                restrict: 'A',
                scope: false,
                link: function (scope, element, attributes) {
                    element.bind('click', function () {
                        if (attributes.preClick) {
                            eval('scope.' + attributes.preClick);
                        }
                    });

                    if (attributes.animate !== undefined) {
                        scope.$watch(attributes.animate, function (newValue) {
                            if (newValue == true) {
                                element.addClass('animated');
                                // pause 400ms so animation can complete
                                $timeout(angular.noop, 400)
                                    .then(function () {
                                        element.removeClass('animated');
                                        // I would like to invoke the original 
                                        // ngClick here, and then remove it from the 
                                        // queue so that it doesn't fire it again.
                                        // Reason for invoking it here is that if I
                                        // don't, then the base ngClick event will
                                        // fire before this promise is resolved.
                                        eval('scope.' + element.ngClick);
                                        // ??
                                    });
                            }
                        });
                    }
                }
            };
        }]);
angular.module('sales')
    .controller(
        'ProductController',
        [
            '$scope', 'ProductService',
            function ($scope, $timeout, service) {

                $scope.clickedProduct = null;

                $scope.onClicking = function (product) {
                    $scope.clickedProduct = product;
                };

                $scope.wasClicked = function (product) {
                    return $scope.clickedProduct === product;
                };

                $scope.onClick = function (product) {
                    service.selected = product;
                };
            }
        ]);