【发布时间】:2015-09-23 00:49:50
【问题描述】:
我遇到了一个问题,即我根据状态更改动态显示和隐藏按钮,但对于应该隐藏按钮的情况,我观察到按钮隐藏之前有明显的延迟。
按钮本身设置为指令如下:
指令
angular.module('app').directive('myActionButton', function() {
return {
restrict: 'E',
templateUrl: 'myActionButton.html',
controller: function($scope, $rootScope, MyActionButton) {
$scope.myActionButton = MyActionButton;
return $rootScope.$on('$stateChangeStart', function(event, toState, toParams, fromState, fromParams) {
return $scope.myActionButton.hide();
});
}
};
});
模板
<md-button ng-show="myActionButton.visible" class="md-fab md-fab-bottom-right" aria-label="Add" ng-click="myActionButton.mainAction($event)">
<md-icon class="material-icons">add</md-icon>
</md-button>
服务
var MyActionButton;
MyActionButton = function() {
var myActionButton;
myActionButton = {};
myActionButton.visible = false;
myActionButton.mainAction = null;
myActionButton.setMainAction = function(fn) {
myActionButton.mainAction = fn;
myActionButton.show();
};
myActionButton.clearMainAction = function() {
myActionButton.mainAction = null;
myActionButton.hide();
};
return myActionButton;
};
angular.module('app').service('MyActionButton', MyActionButton);
如您所见,我在指令的控制器中使用绑定服务。我还从绑定到我的应用程序中 ui-router 加载的视图的其他控制器中使用此服务。
在需要显示按钮的 ui-router 加载的页面控制器上,我注入我的服务并调用
MyActionButton.setMainAction(some function reference here)
这反过来又在服务本身中调用 show()。
这一切都很好,页面会在需要时显示按钮。但是对于不需要显示按钮的页面,我不会在页面控制器中调用我的服务来隐藏按钮。
相反,我在指令的控制器中监听 $stateChangeStart 事件,然后调用我的服务的 clearMainAction 函数。
对于不需要按钮的页面,这确实有效,但是从显示按钮的页面转换时,一旦状态更改完成,需要几秒钟才能隐藏。
另外,我应该提到我正在使用 angular material 及其 md-tabs,并在每个选项卡上配置了 ui-sref 属性。
谁能解释为什么我会看到按钮隐藏延迟?
谢谢
更新
这是一个基于我分享的代码的代码笔 - http://codepen.io/anon/pen/GpqLgL
从 Tab 1 到 2 或 3 单击时,您会看到该按钮暂时显示,然后在短暂延迟后隐藏。
【问题讨论】:
-
创建一个复制问题的演示。当然,似乎整个事情都可以简化。什么决定了按钮是否显示的标准?
-
当然,会收集一些东西并更新我的 OP。该按钮应根据将 mainAction 设置为函数引用来切换可见性 - 如果有意义的话!
-
mainAction set to function reference是什么意思?什么标准决定了这部分? -
对于我的任何需要使按钮可见的页面,它们的控制器只需要注入 MyActionButton 服务,然后调用 setMainAction 并传入页面控制器中声明的函数。因此,按钮的 ng-click 将调用该页面需要的任何功能。无论如何,最好在一个工作示例中展示 - 我很快就会把一些东西拼凑起来。
-
看看我刚刚添加的codepen,我知道延迟可能看起来不是那么糟糕,但是如果状态配置中有解析,那么我认为这也会延迟隐藏按钮。跨度>
标签: angularjs