AngularJS:单击活动选项卡会删除位置哈希标签。
AngularJS:单击活动选项卡会删除位置哈希标签。
在ui-router动态创建的链接被浏览器跟随之前,我想要验证某个条件。我查看了$rootscope.$on('$stateChangeStart', ..),但是我无法从那里访问controller.$scope。我还需要在应用程序的几个地方使用这个,并且会很麻烦。请记住,ui-sref与ui-sref-active相连(一起工作),所以我不能删除ui-sref,并通过$state.$go('some-state')在ng-click中调用一个函数来使用。条件应该在一个$scope函数内评估,并且在on-click事件(在转换之前能够取消它)中。我需要像这样的东西:
我尝试过:
还有:
前往某个状态
甚至:
但是都不起作用。
问题的原因是点击活动标签会删除位置哈希标签。解决方法是创建一个指令来中断最终改变状态的事件链。该指令还可以阻止在相同元素上执行ng-click。以下是相关的javascript代码:
module.directive('eatClickIf', ['$parse', '$rootScope', function($parse, $rootScope) { return { // this ensure eatClickIf be compiled before ngClick priority: 100, restrict: 'A', compile: function($element, attr) { var fn = $parse(attr.eatClickIf); return { pre: function link(scope, element) { var eventName = 'click'; element.on(eventName, function(event) { var callback = function() { if (fn(scope, {$event: event})) { // prevents ng-click to be executed event.stopImmediatePropagation(); // prevents href event.preventDefault(); return false; } }; if ($rootScope.$$phase) { scope.$evalAsync(callback); } else { scope.$apply(callback); } }); }, post: function() {} } } } } ]);
以下是相关的html代码:
相关链接:[PLUNKER](http://plnkr.co/edit/AKQasLfnvZFkKdHz3nEQ?p=preview)
还有一些评论提到了其他更简单、有效和通用的处理方法,但这个方法是一种可行的解决方案。