Angular监视指令中$ http.pendingRequests的更改

时间:2014-07-06 09:37:36

标签: javascript angularjs angularjs-directive

嗨,我是Angular的新人,我仍然想要了解事情的运作方式。

我正在创建一个基于密钥的loaging box指令,该密钥将成为服务的URL。

我想要做的是监视$ http.pendingRequests中的更改,并验证数组中的任何对象是否包含我给加载框的密钥。这就是我所拥有的:

define(['angular', './../../module'], function (angular, directivesModule) {
directivesModule.directive('loadingBoxDir', ['EVENTS', '$http', function (EVENTS, httpExtenderSvc) {
    var headerDir = {
        restrict: 'E',
        templateUrl: 'App/scripts/main/directives/loadingBox/LoadingBoxDir.html',
        scope: {
            loadingKey: '=',
        }
    };

    headerDir.link = function (scope, element) {
        element.hide();
        displayRotatingBox(scope, element);

        //first failed attempt 
        scope.$watch($http.pendingRequests, function() {
            //logic executed to display or hide loading box
        });

        //second failled attempt
        scope.$on('ajaxStarted', function () {
            //display or hide rotating box based on $http.pendingRequests
        });

        //second failled attempp
        scope.$on('ajaxCompleted', function () {
            //display or hide rotating box based on $http.pendingRequests
        });
    };

    var isRotatingBoxActive = false;

    function displayRotatingBox(scope, element) {
        var pendingRequests = httpExtenderSvc.getPendingRequests();
        angular.forEach(pendingRequests, function (request) {
            if (request.url.indexOf(scope.loadingKey) !== -1) {
                element.show();
                isRotatingBoxActive = true;
            }
        });
    }

    function hideRotatingBox(element) {
        if (isRotatingBoxActive) {
            element.hide();
        }
    }

    return headerDir;
}]);

});

首次尝试 - 我的第一次尝试是尝试根据$http.pendingRequests$watch上观看更改。我期望发生的是每次将对象添加到pendingRequests或删除我的功能都会被执行。这不起作用我认为因为被监视的对象必须在范围集上...我不是真的确定这是否是原因,但这是我目前对问题的理解。

第二次尝试 - 我创建了一个HttpInterceptor,并根据请求和ajaxCompleted requestErrorresponseresponseError广播了ajaxStarted。这种情况下的问题是,当我在drective $http.pendingRequests n事件中检查$o时,尚未添加待处理请求。

有没有人知道如何从指令的上下文中查看$http.pendingRequests对象的更改?

3 个答案:

答案 0 :(得分:15)

我认为您应该可以在手表中使用function()语法。

scope.$watch(function() {
    return $http.pendingRequests.length;
}, function() {
    //logic executed to display or hide loading box
});

$watch

docs中解释了语法

答案 1 :(得分:7)

观看功能的变化

scope.$watch(function() {
    return $http.pendingRequests.length > 0;
}, function(hasPending) {
    if (hasPending) {
        // show wait dialog
    }
    else  {
         // hide wait dialog
    }
});

答案 2 :(得分:0)

我来晚了一点,但这是对pixelbits答案的改进:

scope.isBusy = function () {
    return $http.pendingRequests.length > 0;
};
scope.$watch(scope.isBusy, function (hasPending) {
    if (hasPending) {
      elm.show();
    } else {
      elm.hide();
    }
});

您可能希望将其放在这样的指令中:

.directive('loadingBoxDir', ['$http', function ($http) {
    return {
       restrict: 'A',
       link: fn_link
    };
    function fn_link(scope, elm) {
       scope.isBusy= function () {
           return $http.pendingRequests.length > 0;
       };
       scope.$watch(scope.isBusy, function (hasPending) {
           if (hasPending) {
              elm.show();
           } else {
              elm.hide();
           }
       });
    }
}]);