当您拥有优先级为>的自定义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;
};
}
]);
有什么想法?有一个更好的方法吗?