Javascript 覆盖整个角度应用的顶级模态对话框

Javascript 覆盖整个角度应用的顶级模态对话框,javascript,angularjs,angular-ui,angular-ui-bootstrap,Javascript,Angularjs,Angular Ui,Angular Ui Bootstrap,我想使用一个模式实现一个登录对话框(来自AngularUIBootstrap项目)。 它应该覆盖整个应用程序,在背景中覆盖它,并且应该能够在AngularJS服务将变量设置为false时立即引发 我不喜欢使用登录页面的路由,因为我希望在应用程序中保留输入值 如何观察变量并正确触发模态对话框的open()-函数 编辑:我使用Thrift与服务器通信,因此在我的情况下,查看$http状态代码通常不容易…有几种方法可以做到这一点。由于modal本身就是一个服务,所以您可以直接从您的服务调用open。或

我想使用一个模式实现一个登录对话框(来自AngularUIBootstrap项目)。 它应该覆盖整个应用程序,在背景中覆盖它,并且应该能够在AngularJS服务将变量设置为false时立即引发

我不喜欢使用登录页面的路由,因为我希望在应用程序中保留输入值

如何观察变量并正确触发模态对话框的open()-函数


编辑:我使用Thrift与服务器通信,因此在我的情况下,查看$http状态代码通常不容易…

有几种方法可以做到这一点。由于modal本身就是一个服务,所以您可以直接从您的服务调用open。或者,服务可以发布一个事件,有人可以监听并触发登录页面

如果您确实想查看特定变量(因为它可能会从不同的位置更改),可以在$rootScope上设置$watch,然后调用open

您可以使用module并使用它的$modal服务来显示登录模式,而无需重定向到任何其他页面

您可以在angular应用程序演示应用程序安全服务中找到相同的实现-


我建议您为此使用事件。诀窍是监视不成功的服务调用,假设您的后端让请求失败,并发送正确的访问被拒绝状态(403)。当链中有多个调用时,标志
$rootScope.isLogging
用于防止出现多个LoginDialog

未经测试的代码来自我的想法,因此请对其进行测试并在出现错误/打字错误时进行更正

<html ng-app="myApp">
</html>
  • 角度>=1.2.0

  • angular-ui.bootstrap>=0.7

    我想他已经在说他正在使用angular-ui bootstrap的模式服务,他只是想从他的服务中找到触发它的方法。到目前为止,你得到了三个答案,选择一个:)我正在使用Thrift与服务器通信,所以在我的情况下,监视$http状态代码通常并不容易。。。
    angular.module('myApp', ['ui.bootstrap.modal'])
    .run(function($rootScope, $modal) {
        $rootScope.isLoggingIn = false;
        $rootScope.$on('showLoginDialogEvent', function (e, evtArgs) {
            $rootScope.isLoggingIn = true;
            $modal.open({
                templateUrl: 'views/loginView.html', 
                controller: 'LoginDialogController'})
            .result.then(function(){
                 $rootScope.isLoggingIn = false;
            });
        }
    });
    
    angular.module('requestInterceptor', [])
    .config(function ($httpProvider) {
        $httpProvider.interceptors.push('RequestInterceptor');
    })
    .factory('RequestInterceptor', function ($q, $rootScope) {
        return {
            'request': function (config) {
                return config || $q.when(config);
            },
    
            'requestError': function(rejection) {
                return $q.reject(rejection);
            },
    
            'response': function(response) {
                return response || $q.when(response);
            },
    
            'responseError': function(rejection) {
                if(!$rootScope.isLoggingIn && rejection.status === 403)
                   $rootScope.$broadcast('showLoginDialogEvent');
                return $q.reject(rejection);
            }
        }
    }