AngularJS(1.1.5):您可以使用优先级cancel取消指令吗
当您有一个优先级>0的自定义ng click指令首先触发时,是否可以阻止内置ng click处理程序触发?还是以某种方式延迟内置的 在我的例子中,我有一个自定义的ngClick指令,它将动画应用于元素,然后等待动画完成。一旦完成,并且只有到那时,内置的NGO才会单击“点火”。原因是单击的元素位于滑出抽屉上,该抽屉自动隐藏在ngClick处理程序中。如果指令不能阻止它触发,那么在动画开始之前抽屉就关闭了 从custom指令中,我可以使用它来调用默认的ngClick,但是在这种情况下需要取消原始命令 要求:解决方案不应要求开发人员在其ngClick处理程序中编写任何代码。我当然可以在控制器中编写代码,但我不想让控制器知道它应该等待。i、 e.如果我改变指令执行指标的方式,并且需要不同的时间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,但是在这种情况下需要取消原始命令
$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;
};
}
]);