AngularJS(1.1.5):您可以取消优先取消的指令吗?

时间:2013-09-26 20:43:26

标签: angularjs angularjs-directive angularjs-scope

当您拥有优先级为>的自定义ng-click指令时,是否可以保持内置ng-click处理程序不被触发? 0先发射?或者以某种方式推迟内置的?

在我的情况下,我有一个自定义的ngClick指令,它将动画应用于元素,然后等待动画完成。一旦完成,只有这样,内置的ngClick才会激活。推理是,单击的元素位于滑出式抽屉上,该抽屉在ngClick处理程序中自动隐藏。如果指令无法阻止它被触发,那么在动画开始之前抽屉就会关闭。

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

要求:解决方案不应要求开发人员在其ngClick处理程序中编写任何代码。我绝对能够在控制器中对此进行编码,但希望避免控制器必须知道它应该等(即如果我改变指令如何实现指标并且需要不同的时间)

$timeout(function() {service.close();}, 400);

这是我想要完成的一个例子。

标记

<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;
                };
            }
        ]);

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

0 个答案:

没有答案