簡體   English   中英

angularjs攔截器$廣播無效

[英]angularjs interceptor $broadcast doesn't work

我在玩http://ngmodules.org/modules/http-auth-interceptor的代碼,我想知道為什么

$rootScope.$broadcast('loginRequired');

不會在控制器中觸發警報

$scope.$on('loginRequired',function() {
    alert('loginRequired');   
});

編碼:

<!doctype html>
<html ng-app="myModule">
<head>
    <meta charset="utf-8">
</head>

<body>
    <div id="content" class="ng-view"></div>
    <script src="http://code.angularjs.org/1.1.5/angular.min.js"></script>
    <script>
        var buffer = angular.module('http-auth-interceptor-buffer', []);
        buffer.factory('httpBuffer',  function($injector) {
            var buffer = [];
            var $http;

            function retryHttpRequest(config, deferred) {
                function successCallback(response) {
                    deferred.resolve(response);
                }
                function errorCallback(response) {
                    deferred.reject(response);
                }
                $http = $http || $injector.get('$http');
                $http(config).then(successCallback, errorCallback);
            }

            return {

                append: function(config, deferred) {
                    buffer.push({
                        config: config,
                        deferred: deferred
                    });
                },

                retryAll: function(updater) {
                    for (var i = 0; i < buffer.length; ++i) {
                        retryHttpRequest(updater(buffer[i].config), buffer[i].deferred);
                    }
                    buffer = [];
                }
            };
        });

        var app = angular.module('myModule', ['http-auth-interceptor-buffer']);
        app.config(function($httpProvider,$routeProvider, $locationProvider) {
            $httpProvider.interceptors.push('securityInterceptor');
            $routeProvider.
            when('/one',{
                controller: 'OneCtrl',
                /*resolve: {
                    my: function(Data) {
                        return Data.getData();
                    }
                },*/
                templateUrl: './_one.html'
            }).
            when('/two', {
                controller: 'TwoCtrl',
                templateUrl:'./_two.html'
            })
            .otherwise({
                redirectTo: '/one'
            });
        });

        app.controller('OneCtrl',function($scope,Data) {
            $scope.my = Data.getData();
            $scope.$on('loginRequired',function() {
                alert('loginRequired');   
            });
        });

        app.controller('TwoCtrl',function($scope) {

        });

        app.factory('Data', function($http,$q) {
            return {
                getData : function() {
                    var deferred = $q.defer();
                    var promise = $http.get('./security.php').success(function (response) {
                        deferred.resolve(response);
                    });

                    // Return the promise to the controller
                    return deferred.promise; 
                }
            }
        });

        app.factory('securityInterceptor', function($q, $rootScope,httpBuffer) {
            return {
                request: function(config) {
                    return config || $q.when(config);
                },

                requestError: function(rejection) {
                },

                response: function(response) {
                    return response || $q.when(response);
                },

                responseError: function(rejection) {
                    if(rejection.status === 401) {
                        var deferred = $q.defer();
                        httpBuffer.append(rejection.config, deferred);
                        $rootScope.$broadcast('loginRequired');
                        return deferred.promise;
                    }

                    return $q.reject(rejection);
                }
            };
        });
    </script>
</body>
</html>

更新

security.php

<?php
header('HTTP/1.1 401 Unauthorized');
$data = 'MyTets';

echo json_encode($data);

有什么問題嗎?

我通過把你的代碼

$rootScope.$broadcast('loginRequired');

在安全中

response: function(response) {
    $rootScope.$broadcast('loginRequired');
    return response || $q.when(response);
},

在模擬php文件的響應時遇到問題。 您的代碼和事件運行良好。 它應該來自您的未返回401的php文件,對嗎?

這里是一個plunker 這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM